【发布时间】:2021-10-24 17:30:36
【问题描述】:
我想使用 OpenMP 并行执行以下 C++ 循环以提高效率。 (array2d 中每个元素的值可以是 0 或 1 或 2。array2d 的值对效率并不重要,所以我只是从 0、1 和 2 中随机设置每个值。count 中的值是初始化为 0。)
int array2d[100][10000];
int count[3][3][3];
//omp_set_num_threads(2);
//#pragma omp parallel for
for (int i = 0; i < 10000; ++i) {
int x = array2d[10][i];
int y = array2d[40][i];
int z = array2d[78][I];
//#pragma omp atomic
count[z][x][y]++;
}
但如果我使用 2、4 或 8 个线程来并行循环 #pragma omp parallel for,我将无法获得改进。并行版本的执行时间大于顺序版本。我很好奇这个循环是否可以通过 OpenMP 并行性来改进?如果是,我怎样才能缩短执行时间?
【问题讨论】:
-
迭代次数非常少,而且每次迭代中的工作量都非常小,以获得任何合理的并行加速。通常,您至少需要一些适度的工作来分摊与线程相关的开销(例如创建线程)。
-
此外,
count数组元素的原子增量可能会导致严重的缓存争用,这会使事情变得更糟。在您的情况下,几乎可以保证,因为这个数组非常小——它只占用两三个缓存行。最好为每个线程创建count的线程本地副本,并在最后 reduce 它们。
标签: c++ performance parallel-processing openmp