我的代码看起来像这样:
for(i=0; i<max;i++){
for(j=0; j<max2;j++)
//stuff
}
for(i=0; i<max;i++){
for(j=0; j<max2;j++)
//other stuff
}
for(i=0; i<max;i++){
for(j=0; j<max2;j++)
//final stuff
}
我想使用OpenMP并行化这个。什么是最好的方法?我尝试在开头#pragma omp parallel private(i)
和#pragma omp for
每个j
循环之前做 #pragma omp parallel private(i)
{
for(i=0; i<max;i++){
#pragma omp for
for (j=0; j<max2;j++){
//and so on and so forth
。这就是我的意思:
for
问题是,这对我没有任何性能提升。我怀疑这是因为3个{{1}}循环并不是并行运行的...如果我能让这3个同时运行,我想我可以获得性能提升。有任何想法吗?谢谢!
答案 0 :(得分:2)
快速解决方法是创建一个迭代部分并将其平行:
#pragma omp for
for (k=0;k<3;k++){
if (k==0) do_stuff();
if (k==1) do_other_stuff();
if (k==2) do_other_other_stuff();
}
更好的解决方法是使用omp sections
指令。 (解决方案取自here)
#pragma omp parallel sections
{
#pragma omp section
{
/* Executes in thread 1 */
do_stuff();
}
#pragma omp section
{
/* Executes in thread 2 */
do_other_stuff();
}
#pragma omp section
{
/* Executes in thread 3 */
do_other_other_stuff();
}
}