C++ OpenMP-并行化嵌套循环
我在尝试重新编码嵌套for循环以使其并行化时遇到问题:C++ OpenMP-并行化嵌套循环,c++,multithreading,openmp,C++,Multithreading,Openmp,我在尝试重新编码嵌套for循环以使其并行化时遇到问题: for(i=0; i<n; i++) { for(j=0; j<n; j++) { if(asubsref(struct1,j) > 0) asubsref(struct2,j) = asubsref(struct3,j) + 1; } for(j=0; j<n; j++) asubsref(struct1,j) = asubsr
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
if(asubsref(struct1,j) > 0)
asubsref(struct2,j) = asubsref(struct3,j) + 1;
}
for(j=0; j<n; j++)
asubsref(struct1,j) = asubsref(struct2,j) - asubsref(struct3,i);
}
for(i=0;i我在这段代码中看到的是三个数组:
array1: asubsref(seed,0) ... asubsref(seed,n-1)
array2: asubsref(bin,0) ... asubsref(bin,n-1)
array3: asubsref(w,0) ... asubsref(w,n-1)
如果此假设正确且asubsref不会产生任何副作用,则可以导出以下不变量:
循环执行结束后,array2[j]递增
乘以最大数x,即数组3[i]之和
对于i,从0到x小于array1[j]
您可以这样做。首先,您可以合并两个最内层的循环,因为(在我们的假设下)它们的迭代是独立的:
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
if(asubsref(seed,j) > 0)
asubsref(bin,j) = asubsref(bin,j) + 1;
asubsref(seed,j) = asubsref(seed,j) - asubsref(w,i);
}
}
for(i=0;i我在这段代码中看到的是三个数组:
array1: asubsref(seed,0) ... asubsref(seed,n-1)
array2: asubsref(bin,0) ... asubsref(bin,n-1)
array3: asubsref(w,0) ... asubsref(w,n-1)
如果此假设正确且asubsref不会产生任何副作用,则可以导出以下不变量:
循环执行结束后,array2[j]递增
乘以最大数x,即数组3[i]之和
对于i,从0到x小于array1[j]
您可以这样做。首先,您可以合并两个最内层的循环,因为(在我们的假设下)它们的迭代是独立的:
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
if(asubsref(seed,j) > 0)
asubsref(bin,j) = asubsref(bin,j) + 1;
asubsref(seed,j) = asubsref(seed,j) - asubsref(w,i);
}
}
for(i=0;我也是,你确定:asubsref(bin,j)=asubsref(bin,j)+1;
和asubsref(bin,j)+=1;
是相同的语句吗?如果asubsref
有副作用,这可能不是真的。我的意思是:当您在没有OpenMP的情况下编译代码的第二个版本时,结果是否“正确”?是否有特定的原因让您希望并行嵌套循环而不是最外层的循环?@AntonPegushin-这是最外层的循环这是并行的。但是它被分成了两个循环。这当然是有问题的(取决于对asubsref
的所有调用的副作用)抱歉,由于我在下半部分的代码完全错误,我应该先检查它是否在没有pragmas的情况下工作!而且,我想并行化外部循环,而不是内部循环。感谢您的帮助!另外,您确定:asubsref(bin,j)=asubsref(bin,j)+1;
和asubsref(bin,j)+=1;
是相同的语句吗?如果asubsref
有副作用,这可能不是真的。我的意思是:当您在没有OpenMP的情况下编译代码的第二个版本时,结果是否“正确”?是否有特定的原因让您希望并行嵌套循环而不是最外层的循环?@AntonPegushin-这是最外层的循环这是并行的。但是它被分成了两个循环。这当然是有问题的(取决于对asubsref
的所有调用的副作用)抱歉,由于我在下半部分的代码完全错误,我应该先检查没有pragmas的代码是否有效!而且,我想并行化外部循环,而不是内部循环。谢谢你的帮助!
#pragma omp parallel for (private i)
for(j=0; j<n; j++)
{
for(i=0; i<n; i++)
{
if(asubsref(seed,j) > 0)
asubsref(bin,j) = asubsref(bin,j) + 1;
asubsref(seed,j) = asubsref(seed,j) - asubsref(w,i);
}
}