gpt4 book ai didi

c++ - 带有嵌套循环和函数调用的 openmp

转载 作者:行者123 更新时间:2023-11-28 07:20:25 25 4
gpt4 key购买 nike

我有几个嵌套循环,我将第一个循环置于并行模式。 aparmpar 是在循环中修改其值的结构,然后调用函数 breakLogic 生成一个结构,我将其存储在预先创建的这些结构的 vector 。一、二 ... 已在函数的前面声明。

我已尝试包含 ordered 和 critical 以确保准确性,但我仍然得到不正确的结果。

#pragma omp parallel for ordered private(appFlip, atur, apar, mpar, i, j, k, l, m, n) shared(rawFlip)
for(i=0; i<oneL; i++)
{
initialize mpar
#pragma omp critical
apar.one = one[i];
for(j=0; j<twoL; j++)
{
apar.two = two[j];
for(k=0; k<threeL; k++)
{
apar.three = floor(three[k]*apar.two);
appFlip = applyParamSin(rawFlip, apar);
for(l=0; l< fourL; l++)
{
mpar.four = four[l];
for(m=0; m<fiveL; m++)
{
mpar.five = five[m];
for(n=0; n<sixL; n++)
{
mpar.six = add[n];
atur = breakLogic(appFlip, mpar, dt);
#pragma omp ordered
{
sinResVec[itr] = atur;
itr++;
}
}
}
}
r0(appFlip);
}
}
}

或者这段代码不利于并行?是否有任何 g++ 工具可以分析并行处理代码并指出潜在问题?

此修改后的代码有效,但没有提供性能改进。

最佳答案

您的原始代码可以通过一些修改来并行。

  • aparmpar 设置为firstprivateaparmpar应该是线程局部变量,在进入parallel for区域时被初始化;

  • 删除所有 criticalordered 子句,包括 parallel for 指令中的子句。它们没有按您的预期工作;

  • i,j,k,l计算iter >,m,n 移除依赖。

.

iter=(((i*twoL+j)*threeL+k)*fourL+m)*fiveL+n;
sinResVec[itr] = atur;

更新

有关 OpenMP 的更多详细信息,请参见此处,尤其是 privatefirstprivate 之间的区别。

http://msdn.microsoft.com/en-us/library/tt15eb9t.aspx

关于c++ - 带有嵌套循环和函数调用的 openmp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19564240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com