OpenMP中的任务循环调度和分块对于内存利用比较好的情况下对于负载平衡可能是不利的同样有利于负载平衡的策略也有可能对访存的性能不利 OpenMP中的任务循环调度和分块 对于内存利用
OpenMP中的任务循环调度和分块
对于内存利用比较好的情况下对于负载平衡可能是不利的同样有利于负载平衡的策略也有可能对访存的性能不利。因此在对性能优化时必须在优化内存利用和优化负载平衡之间进行折中通过对性能的测量找到能够得到最佳结果的方法。
在OpenMP for结构中使用schedule子句将循环调度和分开信息传达给编译器和运行时库
#pragma omp for schedule (kind [, chunk-size])
如果指定可选的chunk-size块大小则该参数必须是不随循环变化的正整数常量或整数表达式。
注调整块大小时要特别注意因为它可能对性能带来负面影响。随着块大小的减小线程用于从任务队列中获取任务的时间增加结果使访问任务队列的开销增加而降低性能并有可能抵消负载平衡带来的性能提升。
OpenMP的四种调度方案
调度类型 描述 static( 默认不指定块大小 将所有循环划分成大小相等的块或在循环迭代次数不能整除线程数与块大小的乘积时划分成尽可能相等大小的块。 dynamic 使用一个内部队列当线程可用时为其分配由块大小所指定的一定数量的循环迭代。线程完成分配后将从任务队列头取出下一组迭代。块默认大小为1.
注这种调度需要额外的开销
guided 与dynamic类似但块大小刚开始较大然后逐渐减少从而减少了线程用于访问任务队列的时间。chunk可指定所使用的块大小的最小值默认为1 runtime 在运行时使用OMP_SCHEDULE环境变量来确定使用上述三种调度策略中的某一种。More
《多核程序设计》
OpenMP中的任务调度http://blog.csdn.net/drzhouweiming/archive/2007/10/26/1844762.aspx
【本文由:大丰网站开发 http://www.1234xp.com/dafeng.html 处的文章,转载请说明出处】