Multithreading 打开mp线程和一个循环 #pragma omp并行共享(newgrid,grid,maxdiff,epsilon)私有(i,j,diff,maxdiff1,grid0,num#iter) { 做{ #pragma-omp-critical maxdiff=0; //num_iter=num_iter+1; #pragma omp for 对于(i=1;i maxdiff)maxdiff=maxdiff1; } }而(maxdiff>=epsilon); }
除了初始化openmp every do{}while()循环外,我在循环之前创建thead,并在线程之间并行化I循环。问题是它在2个线程上不能正常工作,尽管在1个线程上不能正常工作,而且它有时会卡住。当您写入Multithreading 打开mp线程和一个循环 #pragma omp并行共享(newgrid,grid,maxdiff,epsilon)私有(i,j,diff,maxdiff1,grid0,num#iter) { 做{ #pragma-omp-critical maxdiff=0; //num_iter=num_iter+1; #pragma omp for 对于(i=1;i maxdiff)maxdiff=maxdiff1; } }而(maxdiff>=epsilon); },multithreading,for-loop,openmp,Multithreading,For Loop,Openmp,除了初始化openmp every do{}while()循环外,我在循环之前创建thead,并在线程之间并行化I循环。问题是它在2个线程上不能正常工作,尽管在1个线程上不能正常工作,而且它有时会卡住。当您写入newgrid时,您会遇到争用条件。例如,当一个线程的i与另一个线程的i-1相同时(同样适用于j)。如果希望得到正确的结果,请在写入newgrid时使用临界部分 #pragma omp parallel shared(newgrid,grid,maxdiff,epsilon) privat
newgrid
时,您会遇到争用条件。例如,当一个线程的i
与另一个线程的i-1
相同时(同样适用于j
)。如果希望得到正确的结果,请在写入newgrid时使用临界部分
#pragma omp parallel shared(newgrid,grid,maxdiff,epsilon) private(i,j,diff,maxdiff1,grid0,num_iter)
{
do{
#pragma omp critical
maxdiff = 0;
//num_iter=num_iter+1;
#pragma omp for
for (i=1;i<n;i++)
{
maxdiff1 = 0;
for (j=1;j<n;j++){
grid0 = grid[i+(n+1)*j];
newgrid[i+(n+1)*j] = (grid[i-1+(n+1)*j]+grid[i+1+(n+1)*j]+grid[i+(n+1)*(j-1)]+grid[i+(n+1)*(j+1)]-h*h*f[i-1+(n-1)*(j-1)])/4;
diff = fabs(newgrid[i+(n+1)*j]-grid0);
grid[i+(n+1)*j] = newgrid[i+(n+1)*j];
if (diff>maxdiff1)
maxdiff1 = diff;
}
#pragma omp critical
if (maxdiff1 > maxdiff) maxdiff = maxdiff1;
}
}while(maxdiff>=epsilon);
}
do{
maxdiff=0;
#专用pragma omp(i、j、diff、maxdiff1、grid0)
对于(i=1;i maxdiff)maxdiff=maxdiff1;
}
}而(maxdiff>=epsilon);
将所有代码放在一个大omp范围内没有任何价值。这只会使代码更难理解,并且不会影响性能。
do {
maxdiff = 0;
#pragma omp for private(i,j, diff, maxdiff1, grid0)
for (i=1;i<n;i++) {
maxdiff1 = 0;
for (j=1;j<n;j++) {
grid0 = grid[i+(n+1)*j];
#pragma omp critical
newgrid[i+(n+1)*j] = (grid[i-1+(n+1)*j]+grid[i+1+(n+1)*j]+grid[i+(n+1)*(j-1)]+grid[i+(n+1)*(j+1)]-h*h*f[i-1+(n-1)*(j-1)])/4;
diff = fabs(newgrid[i+(n+1)*j]-grid0);
grid[i+(n+1)*j] = newgrid[i+(n+1)*j];
if (diff>maxdiff1)
maxdiff1 = diff;
}
#pragma omp critical
if (maxdiff1 > maxdiff) maxdiff = maxdiff1;
}
}while(maxdiff>=epsilon);