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 打开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

除了初始化openmp every do{}while()循环外,我在循环之前创建thead,并在线程之间并行化I循环。问题是它在2个线程上不能正常工作,尽管在1个线程上不能正常工作,而且它有时会卡住。

当您写入
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);