Multithreading 使用OpenMP在线程之间划分循环任务
假设我想在威胁(比如4个线程)之间运行以下循环,这样每个线程负责计算(N/4),其中N是矩阵的行数Multithreading 使用OpenMP在线程之间划分循环任务,multithreading,openmp,Multithreading,Openmp,假设我想在威胁(比如4个线程)之间运行以下循环,这样每个线程负责计算(N/4),其中N是矩阵的行数 #pragma omp parallel num_threads(4) private(i,j,M) shared(Matrix) { #pragma omp for schedule(static) for(i=0; i<N; i++) { for(j=0; j<N; j++) { M[i][j]= Matrix[i][j] + (Matri
#pragma omp parallel num_threads(4) private(i,j,M) shared(Matrix)
{
#pragma omp for schedule(static)
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
M[i][j]= Matrix[i][j] + (Matrix[i][j] * Matrix[j][i]);
}
}
}
#pragma omp并行num_线程(4个)私有(i,j,M)共享(矩阵)
{
#计划的pragma omp(静态)
对于(i=0;iYes,当您在parallel
pragma中使用for
pragma时,OpenMP将自动在线程之间分配循环的工作。您的意思是Matrix[i][j]=Matrix[i][j]+(Matrix[i][j]*Matrix[j][i];
而不是M[i][j]=Matrix[i][j]+(Matrix[i][j]);
?感谢您的回复。不,我的意思是将结果存储在M[][]中。如果我想明确指定每个线程的块,是否可能?是的,可能。您可以使用计划(静态,块)
。这将为每个线程提供一个要处理的迭代块。一旦每个线程完成了它的块,它将承担下一个块,直到所有N次迭代都完成。另一种将所有能力交给您的方法是使用#pragma omp parallel
而不使用#pragma omp for
并在thr之间划分迭代eads由您自己基于omp\u get\u num\u threads
和omp\u get\u thread\u num
函数进行。我不确定您的代码为什么会崩溃(在我的测试中没有),但请注意,private
子句只在线程堆栈上分配变量。因此,在并行部分之前和之后,M
的值都将是未定义的(可能不是您想要的)。我认为它应该声明为shared
。