2017-03-02 88 views
1

这是一个在openmp c中转置矩阵的程序,我用的编译器是gcc。 我试了私人(我,j)和私人(我)分开。因为它是线程的,我无法找到准确发生的变化。private(i,j)在这段代码中的作用是什么?如果我从私人(i,j)省略i或j,会有什么变化吗?

#pragma omp parallel for private (i,j) 
    for(i=1; i<size; i++) 
{ 
#pragma omp parallel for 
    for(j=0; j<i; j++) 
     { 
     temp = mat1[i][j]; 
      mat1[i][j] = mat1[j][i]; 
      mat1[j][i] = temp; 
     } 
} 

运行时间每次都不一样。尽管我有双核心,但我尝试了5线程。谢谢。

+0

请参阅http://stackoverflow.com/q/37845291/620382 – Zulan

+2

我会更担心temp的private/shared属性。 –

+0

您是否设置了OMP_NESTED?如果没有,那么内部并行就会被忽略(这可能是你想要的:-)),如果你有,那么你可能会超出你的要求! (开始25个线程)。你最好采用一种在最小范围内声明变量的风格。那么你不必担心私人在这里。 –

回答

1

private(i,j)在这段代码中的作用是什么?

无。

如果我从private(i,j)中省略i或j,会有什么变化吗?

没有,因为OpenMP的指定

在关联for循环一个forparallel fortaskloop,或distribute构建体(多个)的循环迭代变量(s)为(是) 私人的。

您不需要明确声明迭代变量为private,并且这样做不会改变任何内容。通常,您不得为具有数据共享属性的变量声明数据共享属性,但对于冗余属性声明的某些情况(包括该属性声明),OpenMP会作出特殊例外。

相关问题