Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 使用OpenMP在线程之间划分循环任务_Multithreading_Openmp - Fatal编程技术网

Multithreading 使用OpenMP在线程之间划分循环任务

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

假设我想在威胁(比如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] + (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