作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 OpenMP (OMP) 并行化 for 循环。但是,OMP 似乎会将我的 for 循环划分为相等的间隔大小,例如
for( int i = 0; i < n; ++i ) {
...
}
有 NUM_THREADS
个 block ,每个 block 大小为 n/NUM_THREADS
。不幸的是,我用它来并行化对三角矩阵的扫描,因此最后一个 block 比第一个 block 有更多的工作要做。所以我真正想问的是在这样的场景下如何进行负载均衡。我可以想象,if ( i % THREAD_NUMBER == 0) ..
会很好(换句话说,循环中的每次运行都分配给不同的线程)。我知道这不是最优的,因为缓存会被破坏,但是,有没有办法用 OMP 控制循环分区?
最佳答案
可以将一个子句添加到您的#pragma omp for
构造中,该子句称为schedule。
有了它,您可以指定 block (您称之为一个分区)如何在线程上分布
可以找到调度变体的描述 here .对于您的目的,dynamic
或 guided
最适合。
使用 dynamic
,每个线程获得相同的迭代次数 (<< total_iterations),并在完成后请求更多迭代。
在 guided
下几乎完成了相同的操作,但在执行期间迭代次数减少,因此您首先获得大量迭代,然后每个请求的迭代次数较少。
关于for-loop - 有没有办法控制 OpenMP parallel_for 构造的分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20612970/
我是一名优秀的程序员,十分优秀!