C++ 矩阵乘法嵌套循环
这是一个矩阵乘法代码,一个C++ 矩阵乘法嵌套循环,c++,c,multithreading,parallel-processing,openmp,C++,C,Multithreading,Parallel Processing,Openmp,这是一个矩阵乘法代码,一个i循环并行,另一个j循环并行。对于这两个版本,Carray的值都是正确的(我已经用较小的矩阵大小进行了测试)。两者之间的性能也没有提高 有人能告诉我这两个版本有什么不同吗?无论矩阵的大小,数组C在这两个版本中是否都准确?提前谢谢 void mat_乘(void) { int t; int i,j,k; #pragma omp parallel for private(k)//并行化i循环 对于(i=0;i
i
循环并行,另一个j
循环并行。对于这两个版本,C
array的值都是正确的(我已经用较小的矩阵大小进行了测试)。两者之间的性能也没有提高
有人能告诉我这两个版本有什么不同吗?无论矩阵的大小,数组C
在这两个版本中是否都准确?提前谢谢
void mat_乘(void)
{
int t;
int i,j,k;
#pragma omp parallel for private(k)//并行化i循环
对于(i=0;i
void mat_乘(void)
{
int t;
int i,j,k;
对于(i=0;i
首先,第一个版本的线程创建开销似乎较低,因为它只创建一次线程。而在第二个版本中,线程似乎将被创建dimension
次
但是根据
人们可能会担心在内部产生新的线程
环不用担心,GCC中的libgomp足够聪明,实际上只有
创建一次线程。一旦团队完成了工作,线程
被送回“码头”,等待新的工作
换句话说,执行克隆系统调用的次数
正好等于最大并发线程数。这个
parallel指令与pthread_create的组合不同
和pthread_join
在第一个版本中,您应该保证变量j
也是私有的
您可以使用嵌套循环并行化的方法,而不是使用两种方法。在OpenMP 3.0中,嵌套循环的并行化可以通过for指令中的折叠子句来处理,即:
void mat_multiply ( void ) {
#pragma omp parallel for collapse(2)
for(int i = 0; i < dimension; i++)
for(int j = 0; j < dimension; j++)
for(int k = 0; k < dimension; k++)
C[dimension*i+j] += A[dimension*i+k] * B[dimension*k+j];
}
void mat_乘(void){
#用于折叠的pragma omp并行(2)
对于(int i=0;i
顺便说一句:看看方块法,你可以看到一个例子(从幻灯片62开始)