C++ OpenMP-并行化嵌套循环

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循环以使其并行化时遇到问题:

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);
   }
}