我基本上有三个关于OpenMp的问题。并发读写OpenMp中的共享变量
Q1。 OpenMp是否提供互斥共享变量?考虑下面的三个嵌套循环的简单矩阵乘法代码,使用C++中的OpenMp并行化。这里A,B和C是动态空间分配双**类型的变量。线程数被适当分配一个值。
#pragma omp parallel
{
int tid = omp_get_thread_num();
int fraction = (n/threadCount);
int start = tid * fraction;
int end = (tid+1) * fraction;
for (int start = 0; i < end; i++)
{
for (int j = 0; j < N; j++)
{
C[i][j] = 0;
for (int k = 0; k < N; k++)
C[i][j] += A[i][k] * B[k][j];
}
}
}
这里的事情是,从A和B读取并写入C的互斥是不必要的。但如果由于A,B和C上的互斥造成额外的开销,则有利于减轻互斥量的A,B和C.如何实现?
Q2。 考虑在上面的代码中引入两个私有变量tempA和tempB,如下所示。
double **tempA, **tempB;
#pragma omp parallel private(tempA, tempB)
{
int tid = omp_get_thread_num();
int fraction = (n/threadCount);
int start = tid * fraction;
int end = (tid+1) * fraction;
tempA = A;
tempB = B;
for (int start = 0; i < end; i++)
{
for (int j = 0; j < N; j++)
{
C[i][j] = 0;
for (int k = 0; k < N; k++)
C[i][j] += tempA[i][k] * tempB[k][j];
}
}
}
该策略是否可以在计算过程中减少A和B的互斥量?我的意思是,虽然所有线程都访问相同的位置(由A和tempA,B和tempB引用),但它们通过不同的局部变量引用它们。
Q3。 另外,我想知道在并行代码段中声明变量tempA和tempB的区别,而不是在外部声明它们。当然,那么我们将不需要该指令中的私人条款。有没有其他的显着差异。
2017-06-22
Melanka
+0
(1)你为什么要用手工作而不是使用'#pragma omp for'? (2)为了同步对共享变量的读写,有['#pragma omp atomic'](https://www.google.com/search?q=pragma+omp+atomic)。 (3)不要重新发明轮子,使用[Blaze](https://bitbucket.org/blaze-lib/blaze)。该线性代数库实现了OpenMP并行化和SIMD向量化矩阵操作。它不能比这更快。 –