如何安全地在下面嵌套for-loop线程,以便在具有8个线程的核心上并行运行程序,并仍按正确的顺序输出数据。我已经使用命令的#pragma OMP尝试,但那个给了我一个错误信息:工作共享区域不可以紧密嵌套在工作共享,临界或显式的任务区域内。Openmp - 嵌套for循环
注:此代码是介绍了并行编程,所以甚少为不断优化
#pragma omp parallel private(t, i, j) shared(nx, ny, nt)
{
// main loop
for (int t = 0; t < nt; t++)
{
cout << "\n" << t;
cout.flush();
// first block
for (int i = 0; i < nx; i++)
{
for(int j=0; j < ny ;j++)
{
if (i> 0 && i < nx - 1 && j >0 && j < ny - 1)
{
vr[i][j] = (vi[i+1][j]+vi[i-1][j]+vi[i][j-1]+vi[i][j+1])/4.;
}
else if (i == 0 && i < nx - 1 && j > 0 && j < ny - 1)
{
vr[i][j] = (vi[i+1][j]+10.+vi[i][j-1]+vi[i][j+1])/4.;
}
else if (i > 0 && i == nx - 1 && j > 0 && j < ny - 1)
{
vr[i][j] = (5.+vi[i-1][j]+vi[i][j-1]+vi[i][j+1])/4.;
}
else if (i > 0 && i < nx - 1 && j == 0 && j < ny - 1)
{
vr[i][j] = (vi[i+1][j]+vi[i-1][j]+15.45+vi[i][j+1])/4.;
}
else if (i > 0 && i < nx - 1 && j > 0 && j == ny - 1)
{
vr[i][j] = (vi[i+1][j]+vi[i-1][j]+vi[i][j-1]-6.7)/4.;
}
}
}
// second block
for (int i = 0; i < nx; i++)
{
for (int j = 0; j < ny; j++)
{
if (fabs(fabs(vr[i][j]) - fabs(vi[i][j])) < 1e-2)
{
fout << "\n" << t << " " << i << " " << j << " "
<< fabs(vi[i][j]) << " " << fabs(vr[i][j]);
}
}
#pragma omp for schedule(static,100)
// third block
for (int i = 0; i < nx; i++)
{
for (int j = 0; j < ny; j++)
{
vi[i][j] = vi[i][j]/2. + vr[i][j]/2.;
}
}
}
}
你可以整理你的格式化位?这是不可读的。你也应该澄清你的意思是“把事情搞砸”,因为这不是一个非常技术性的问题描述。 –
添加的错误消息是否让您更好地理解我的问题?至于清晰度问题,for循环计数't'的增量是最外层的循环,其他嵌套在其中。希望有帮助 – user3332240
如果你整理一下你的格式,这将有所帮助。 –