【发布时间】:2013-03-18 01:18:01
【问题描述】:
在性能方面,以下哪个更有效?
在主线程中赋值并将值复制到所有线程:
int i = 0;
#pragma omp parallel for firstprivate(i)
for( ; i < n; i++){
...
}
在每个线程中声明和分配变量
#pragma omp parallel for
for(int i = 0; i < n; i++){
...
}
在主线程中声明变量,但在每个线程中分配。
int i;
#pragma omp parallel for private(i)
for(i = 0; i < n; i++){
...
}
这似乎是一个愚蠢的问题和/或性能影响可以忽略不计。但是我正在并行化一个执行少量计算并被多次调用的循环,所以我可以从这个循环中挤出的任何优化都是有帮助的。
我正在寻找更底层的解释以及 OpenMP 如何处理这个问题。
例如,如果对大量线程进行并行化,我认为第二种实现会更有效,因为使用 xor 初始化变量比将变量复制到所有线程要高效得多
【问题讨论】:
-
您是否尝试过测量,还是要求我们为您测量?
-
我没有测量它,但我不寻求数字的答案,我寻求更底层的答案。
-
如果您曾尝试测量它然后要求解释结果,这个问题会更有趣。
-
第一个版本不是有效的 OpenMP 代码。其他两个版本是等效的,很可能会导致为提取的 OpenMP 区域生成相同的汇编代码。
标签: c++ multithreading performance parallel-processing openmp