我正在编写一个物理模拟程序。在使用英特尔C ++编译器(icpc)进行编译时,在并行化内部for循环时,我收到意外的减速。代码的要点如下:
for(int i = 0; i < steps; i++){
calculate m here
#pragma omp parallel for
for(int j = 0; j < 3*npos; j++) {
pos[j] += 2*m[j];
}
}
其中m[j]
是指定间隔内的随机数,pos
是粒子位置数组。起初,我认为减速是由于在每个外循环迭代期间线程的创建和破坏。如果是这种情况,如果内环的工作更广泛,那么减速将不那么重要。但是,当npos
从1,000增加到10,000时,我发现减速的规模是不变的,这增加了我的困惑。
为了正确看待这个问题,当npos
= 1,000时,我串行运行大约12秒,并行运行18秒,串行时大约120秒,npos
= 10,000时并行运行180秒。如果有人能够告诉我可能导致这种放缓的原因,那将不胜感激。
我正在编译使用:icpc -qopenmp -03
- 更新 - :恢复兼容性代码并使用g ++进行编译,代码并行化,并按预期获取加速。只有在使用与Intel的icpc编译的相同代码时才会出现减速。因此,我必须遗漏一些关于在英特尔编译器中使用OMP的事情。