我一直在尝试使用 OpenMP 并行化具有不平衡嵌套 for 循环的算法。我不能发布原始代码,因为它是一个闻所未闻的政府的秘密项目,但这里有一个玩具示例:
for (i = 0; i < 100; i++) {
#pragma omp parallel for private(j, k)
for (j = 0; j < 1000000; j++) {
for (k = 0; k < 2; k++) {
temp = i * j * k; /* dummy operation (don't mind the race) */
}
if (i % 2 == 0) temp = 0; /* so I can't use openmp collapse */
}
}
目前,此示例在多线程中运行速度较慢(单线程约 1 秒,2线程约 2.4 秒等)。
注意事项:
外部 for 循环需要按顺序完成(取决于上一步)(据我所知,OpenMP 可以很好地处理内部循环,因此不会在每个步骤中创建/销毁线程,对吗?)
示例中给出了典型的索引号
(100, 1000000, 2)
虚拟操作仅包含几个操作
在最里面的循环之外有一些条件操作,所以折叠不是一种选择(看起来它无论如何都不会提高性能)
看起来像一个令人尴尬的并行算法,但过去两天我似乎无法获得任何加速。这里最好的策略是什么?