Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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
C++ 矩阵乘法嵌套循环_C++_C_Multithreading_Parallel Processing_Openmp - Fatal编程技术网

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开始)