我有几个嵌套循环,我将第一个置于并行模式。 apar
和mpar
是在循环中修改其值的结构,然后调用函数breakLogic
生成一个结构,我将其存储在这些结构的预先创建的向量中。
一,二......已在函数的早期声明。
我试图包含有序和关键以确保准确性,但我仍然得到不正确的结果。
#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 ++工具可以为并行处理配置代码并指出潜在问题?
此修改后的代码有效,但没有提高性能。
答案 0 :(得分:1)
原始代码可以通过一些修改来并行。
将apar
和mpar
设为firstprivate
。 apar
和mpar
应为线程局部变量,并在进入parallel for
区域时进行初始化;
删除所有critical
和ordered
条款,包括parallel for
指令中的条款。他们没有像你期望的那样工作;
使用iter
,i
,j
,k
,l
,m
计算n
以删除依赖。
iter=(((i*twoL+j)*threeL+k)*fourL+m)*fiveL+n;
sinResVec[itr] = atur;
有关OpenMP的详细信息,请参阅此处,尤其是private
和firstprivate
之间的差异。