性能方面,以下哪个更有效?
在主线程中分配并将值复制到所有线程:
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
比将变量复制到所有线程更有效