发明名称 一种基于TBB线程构建块的连续系统仿真多核并行方法
摘要 本发明公开了一种基于TBB的连续系统仿真多核并行方法,主要包括以下步骤:步骤一,搭建TBB并行计算平台;步骤二,构造并行ParaODES模版类;步骤三,模型初始化;步骤四,TBB任务调度初始化;步骤五,仿真时间范围判断;步骤六,调用并行模版类ParaODES;步骤七,仿真结果传递;步骤八,结束TBB任务调度。本发明利用TBB实现连续系统仿真的并行化处理,提高了仿真运算的速度,从而满足仿真的实时性要求,缩短了仿真研究周期;利用TBB进行并行化处理,过程简单灵活,易于操作,具有很好的扩展性;TBB采用多核架构,符合当今并行技术向多核平台发展的方向。
申请公布号 CN101639788B 申请公布日期 2012.07.25
申请号 CN200910092407.0 申请日期 2009.09.10
申请人 北京航空航天大学 发明人 李妮;唐力勇
分类号 G06F9/46(2006.01)I;G06F17/50(2006.01)I 主分类号 G06F9/46(2006.01)I
代理机构 北京永创新实专利事务所 11121 代理人 周长琪
主权项 1.一种基于TBB线程构建块的连续系统仿真多核并行方法,其特征在于,包括以下步骤:步骤一:搭建TBB并行计算平台;在计算机中置入TBB文件包,在VC目录中添加TBB的包含文件、库文件及可执行文件,最后添加TBB20_INSTALL_DIR的值为C:/Program files/Intel/TBB/2.0到系统环境变量;步骤二:构造并行ParaODES模版类;预估计算和校正计算使用parallel_for模版类,根据parallel_for模版构造并行类,并将其命名为ParaODES模版类;具体步骤为:一、编写预估计算和校正计算的程序;模版类ParaODES中的预估计算和校正计算按以下公式进行:预估计算:<maths num="0001"><![CDATA[<math><mrow><msubsup><mi>y</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow><mi>p</mi></msubsup><mo>=</mo><msubsup><mi>y</mi><mrow><mi>i</mi><mo>-</mo><mn>1</mn></mrow><mi>c</mi></msubsup><mo>+</mo><mfrac><mi>h</mi><mn>3</mn></mfrac><mrow><mo>(</mo><msubsup><mrow><mn>8</mn><mi>f</mi></mrow><mi>i</mi><mi>p</mi></msubsup><mo>-</mo><msubsup><mrow><mn>5</mn><mi>f</mi></mrow><mrow><mi>i</mi><mo>-</mo><mn>1</mn></mrow><mi>c</mi></msubsup><mo>+</mo><msubsup><mrow><mn>4</mn><mi>f</mi></mrow><mrow><mi>i</mi><mo>-</mo><mn>2</mn></mrow><mi>c</mi></msubsup><mo>-</mo><msubsup><mi>f</mi><mrow><mi>i</mi><mo>-</mo><mn>3</mn></mrow><mi>c</mi></msubsup><mo>)</mo></mrow><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></mrow></math>]]></maths><maths num="0002"><![CDATA[<math><mrow><msubsup><mi>f</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow><mi>p</mi></msubsup><mo>=</mo><mi>f</mi><mrow><mo>(</mo><msub><mi>t</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub><mo>,</mo><msubsup><mi>y</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow><mi>p</mi></msubsup><mo>)</mo></mrow><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>2</mn><mo>)</mo></mrow></mrow></math>]]></maths>校正计算:<maths num="0003"><![CDATA[<math><mrow><msubsup><mi>y</mi><mi>i</mi><mi>c</mi></msubsup><mo>=</mo><msubsup><mi>y</mi><mrow><mi>i</mi><mo>-</mo><mn>1</mn></mrow><mi>c</mi></msubsup><mo>+</mo><mfrac><mi>h</mi><mn>24</mn></mfrac><mrow><mo>(</mo><msubsup><mrow><mn>9</mn><mi>f</mi></mrow><mi>i</mi><mi>p</mi></msubsup><mo>+</mo><msubsup><mrow><mn>19</mn><mi>f</mi></mrow><mrow><mi>i</mi><mo>-</mo><mn>1</mn></mrow><mi>c</mi></msubsup><mo>-</mo><msubsup><mrow><mn>5</mn><mi>f</mi></mrow><mrow><mi>i</mi><mo>-</mo><mn>2</mn></mrow><mi>c</mi></msubsup><mo>+</mo><msubsup><mi>f</mi><mrow><mi>i</mi><mo>-</mo><mn>3</mn></mrow><mi>c</mi></msubsup><mo>)</mo></mrow><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>3</mn><mo>)</mo></mrow></mrow></math>]]></maths><maths num="0004"><![CDATA[<math><mrow><msubsup><mi>f</mi><mi>i</mi><mi>c</mi></msubsup><mo>=</mo><mi>f</mi><mrow><mo>(</mo><msub><mi>t</mi><mi>i</mi></msub><mo>,</mo><msubsup><mi>y</mi><mi>i</mi><mi>c</mi></msubsup><mo>)</mo></mrow><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>4</mn><mo>)</mo></mrow></mrow></math>]]></maths>其中:<maths num="0005"><![CDATA[<math><mrow><msubsup><mi>f</mi><mi>i</mi><mi>p</mi></msubsup><mo>=</mo><mi>f</mi><mrow><mo>(</mo><msub><mi>t</mi><mi>i</mi></msub><mo>,</mo><msubsup><mi>y</mi><mi>i</mi><mi>p</mi></msubsup><mo>)</mo></mrow><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>5</mn><mo>)</mo></mrow></mrow></math>]]></maths><maths num="0006"><![CDATA[<math><mrow><msubsup><mi>f</mi><mrow><mi>i</mi><mo>-</mo><mn>1</mn></mrow><mi>c</mi></msubsup><mo>=</mo><mi>f</mi><mrow><mo>(</mo><msub><mi>t</mi><mrow><mi>i</mi><mo>-</mo><mn>1</mn></mrow></msub><mo>,</mo><msubsup><mi>y</mi><mrow><mi>i</mi><mo>-</mo><mn>1</mn></mrow><mi>c</mi></msubsup><mo>)</mo></mrow><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>6</mn><mo>)</mo></mrow></mrow></math>]]></maths>式中:h表示计算步长,<img file="FDA0000136333580000017.GIF" wi="62" he="51" />表示状态变量下一步的估计值,<img file="FDA0000136333580000018.GIF" wi="43" he="51" />表示状态变量当前步的校正值,<img file="FDA0000136333580000019.GIF" wi="61" he="51" />表示状态变量上一步的校正值,<img file="FDA00001363335800000110.GIF" wi="56" he="59" />表示状态变量导数当前步的估计值,<img file="FDA00001363335800000111.GIF" wi="55" he="58" />表示状态变量导数下一步的估计值,<img file="FDA00001363335800000112.GIF" wi="421" he="59" />分别表示状态变量导数当前步、前一步、前两步和前三步的校正值,t<sub>i</sub>表示当前时刻,t<sub>i-1</sub>表示上一时刻;式(1)、(2)和式(3)、(4)分别在两个处理内核P<sub>1</sub>、P<sub>2</sub>上并行执行,在P<sub>1</sub>中计算<img file="FDA00001363335800000113.GIF" wi="90" he="51" />然后根据<img file="FDA00001363335800000114.GIF" wi="62" he="51" />的值计算<img file="FDA00001363335800000115.GIF" wi="91" he="51" />在P<sub>2</sub>中计算<img file="FDA00001363335800000116.GIF" wi="70" he="51" />然后根据<img file="FDA00001363335800000117.GIF" wi="43" he="51" />的值计算<img file="FDA00001363335800000118.GIF" wi="78" he="51" />P<sub>1</sub>、P<sub>2</sub>在结束了一步计算之后进行通讯;二、在模版类ParaODES的operator接口中将循环参数修改为blocked_range模板类;将operator接口的最外层循环参数修改成TBB中定义的blocked_range模板类,使之能够支持循环体内任务的并行划分;并行计算模版类ParaODES构造完成;步骤三:模型初始化;在仿真开始时,首先对仿真模型进行初始化,即设置连续系统微分方程组右函数、问题规模n、仿真总时间Tmax、积分步长h;导数、状态量、中间量的变量声明以及各变量赋初值,其中n为方程组中方程的数目;步骤四:TBB任务调度初始化;步骤五:仿真时间范围判断;判断当前时间t是否超出仿真时间范围Tmax,若t<Tmax,则执行步骤六,否则执行步骤八;步骤六:调用并行模版类ParaODES;调用步骤二中的ParaODES模版类完成预估-校正的并行计算,通过ParaODES模版类创建一个线程计算<img file="FDA0000136333580000021.GIF" wi="63" he="51" />的估计值,并根据<img file="FDA0000136333580000022.GIF" wi="62" he="51" />计算导数的估计值<img file="FDA0000136333580000023.GIF" wi="90" he="51" />通过ParaODES模版类创建另一个线程并行计算<img file="FDA0000136333580000024.GIF" wi="44" he="51" />的精确值,并根据<img file="FDA0000136333580000025.GIF" wi="44" he="51" />计算导数的精确值<img file="FDA0000136333580000026.GIF" wi="79" he="51" />最终得到仿真结果<img file="FDA0000136333580000027.GIF" wi="69" he="51" />在上述过程中,需要用到的导数值:当前步导数估计值<img file="FDA0000136333580000028.GIF" wi="81" he="59" />前一步导数校正值<img file="FDA0000136333580000029.GIF" wi="81" he="59" />前两步导数校正值<img file="FDA00001363335800000210.GIF" wi="58" he="59" />和前三步导数校正值<img file="FDA00001363335800000211.GIF" wi="86" he="59" />并得到新的导数估计值<img file="FDA00001363335800000212.GIF" wi="55" he="59" />和导数校正值<img file="FDA00001363335800000213.GIF" wi="78" he="59" />步骤七:仿真结果传递;将步骤六中的当前步导数估计值<img file="FDA00001363335800000214.GIF" wi="81" he="58" />前一步导数校正值<img file="FDA00001363335800000215.GIF" wi="81" he="58" />前两步导数校正值<img file="FDA00001363335800000216.GIF" wi="86" he="58" />前三步导数校正值<img file="FDA00001363335800000217.GIF" wi="56" he="59" />和状态变量当前步的校正值<img file="FDA00001363335800000218.GIF" wi="44" he="51" />这五个参数的值传递给当前变量的后一步,即将<img file="FDA00001363335800000219.GIF" wi="58" he="59" />的值传递给<img file="FDA00001363335800000220.GIF" wi="87" he="59" />将<img file="FDA00001363335800000221.GIF" wi="54" he="59" />的值传递给<img file="FDA00001363335800000222.GIF" wi="86" he="59" />将<img file="FDA00001363335800000223.GIF" wi="51" he="51" />的值传递给<img file="FDA00001363335800000224.GIF" wi="83" he="59" />将<img file="FDA00001363335800000225.GIF" wi="68" he="59" />的值传递给<img file="FDA00001363335800000226.GIF" wi="82" he="58" />将<img file="FDA00001363335800000227.GIF" wi="43" he="51" />的值传递给<img file="FDA00001363335800000228.GIF" wi="90" he="51" />时间t增加一个单位长度;返回步骤五;步骤八:结束TBB任务调度;完成并行计算任务,结束TBB任务调度。
地址 100083 北京市海淀区学院路37号