Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++_Matrix_Parallel Processing_Openmp_Multiplication - Fatal编程技术网

C++ C++;并行矩阵乘法,计算错误

C++ C++;并行矩阵乘法,计算错误,c++,matrix,parallel-processing,openmp,multiplication,C++,Matrix,Parallel Processing,Openmp,Multiplication,我乘法的结果是 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -842150451 -84215045 -842150451 -842150451 -842150451 -84215045 -842150451 -842150451 我不明白为什么,有人能帮忙吗 #include <iostream> #include <stdlib.h

我乘法的结果是

-842150451 -842150451 -842150451 -842150451   
-842150451 -842150451 -842150451 -842150451 
-842150451 -84215045 -842150451 -842150451
-842150451 -84215045 -842150451 -842150451 
我不明白为什么,有人能帮忙吗

#include <iostream>
#include <stdlib.h>
#include <omp.h>
#include <random>
using namespace std;

#define NUM_THREADS 2

double**        A;
double**        B;
double**        C;
double          t_Start;
double          t_Stop;
int             Am;
int             An;
int             Bm;
int             Bn;

void            Get_Matrix();
void            Mat_Mult_Parallel();


int main()
{
    cout << "Matrix A: ";
    cin >> Am >> An;
    cout << "Matrix B: ";
    cin >> Bm >> Bn;

    Get_Matrix();
    Mat_Mult_Parallel();


    system("pause");
    return 0;

}


void Get_Matrix()
{


    A = new double*[Am];
    B = new double*[Bm];
    C = new double*[Am];
    for (int i = 0; i<Am; i++) { A[i] = new double[An]; }
    for (int i = 0; i<Bm; i++) { B[i] = new double[Bn]; }
    for (int i = 0; i<Am; i++) { C[i] = new double[Bn]; }
    omp_set_num_threads(NUM_THREADS);
#pragma omp parallel for private(i,j) schedule(dynamic)
    for (int i = 0; i<Am; i++)
    {
        for (int j = 0; j<An; j++)
        {
            A[i][j] = rand() % 10 +1;
            cout << A[i][j] << " ";


        }
        cout << endl;
    }
    printf("\n");

#pragma omp parallel for private(i,j) schedule(dynamic)
    for (int i = 0; i<Bm; i++)
    {
        for (int j = 0; j<Bn; j++)
        {
            B[i][j] = rand() % 10 + 1;
            cout << B[i][j] << " ";


        }
        cout << endl;
    }
    printf("Matrix Created.\n");
}

void Mat_Mult_Parallel()
{
    int i, j, k;
    t_Start = omp_get_wtime();

    omp_set_num_threads(NUM_THREADS);
#pragma omp parallel for private(i,j) schedule(dynamic)
    for (i = 0; i<Am; i++)
    {
        for (j = 0; j<Bn; j++)
        {
            for (k = 0; k<An; k++)
            {
                C[i][j] += A[i][k] * B[k][j];

            }
            cout << C[i][j] << " ";
        }
        cout << endl;
    }

    t_Stop = omp_get_wtime() - t_Start;
    cout << "Parallel: " << t_Stop << " seconds." << endl;
}
#包括
#包括
#包括
#包括
使用名称空间std;
#定义NUM_线程2
双**A;
双**B;
双**C;
双t_启动;
双t_站;
国际调幅;
INTAN;
int Bm;
int-Bn;
void Get_矩阵();
void Mat_Mult_Parallel();
int main()
{
cout>Am>>An;
cout>Bm>>Bn;
获取_矩阵();
Mat_Mult_Parallel();
系统(“暂停”);
返回0;
}
void Get_矩阵()
{
A=新的双*[Am];
B=新的双*[Bm];
C=新的双*[Am];

对于(int i=0;i您没有初始化矩阵C,但是您使用了“+=”运算符,将值添加到矩阵C中的随机初始值中。因此,您首先需要类似以下内容:

for ( int i = 0; i < Am; i++ )
{
    for ( int j = 0; j < Bn; j++ )
    {
        C[ i ][ j ] = 0.0;
    }
}
for(int i=0;i
或者,您可以使用memset/setmem C功能(取决于您的系统), 这会更快


顺便说一句,不要在并行循环中使用'cout',结果可能会令人困惑。

您没有初始化矩阵C,但您使用了'+='运算符,将值添加到矩阵C中的随机初始值。因此,您首先需要类似以下内容:

for ( int i = 0; i < Am; i++ )
{
    for ( int j = 0; j < Bn; j++ )
    {
        C[ i ][ j ] = 0.0;
    }
}
for(int i=0;i
或者,您可以使用memset/setmem C功能(取决于您的系统), 这会更快


顺便说一句,不要在并行化循环中使用“cout”,结果可能会令人困惑。

不是解决方案,但当前输出的十六进制是0xFFFFFFCDCDCDCD。在visual studio下,该0xCD是未初始化的内存。请尝试将
private(k)
添加到初学者的
omp parallel for
指令中…顺便说一句,
rand()
不是线程安全的,因此最多只能得到不可复制的结果anyway@blazelott你为什么要费心自己从头开始做这件事呢?使用Armadillo这样的库,并将其链接到OpenBLAS,OpenBLAS将为你并行执行乘法。用线性代数重新发明轮子简直是疯狂!BLAS人已经被打败了几十年来一直这样做。你永远无法在性能上打败他们!@量子物理学家只是为了教育目的而不是一个解决方案,但你当前输出的十六进制是0xFFFFFFCDCDCDCDCD。在visual studio下,该0xCD是未初始化的内存。请尝试添加
private(k)
到您的
omp并行程序,用于启动程序的指令…Ho和顺便说一句,
rand()
不是线程安全的,因此最多只能得到不可复制的结果anyway@blazelott你为什么要费心自己从头开始做这件事呢?使用Armadillo这样的库,并将其链接到OpenBLAS,OpenBLAS将为你并行执行乘法。用线性代数重新发明轮子简直是疯狂!BLAS人已经被打败了“几十年来一直如此。在性能上你永远无法打败他们!”这位量子物理学家只是为了教育目的。他说:聪明的编译器(至少是GCC和Intel),将检测到这样的循环,并将其自动替换为
memset
。有趣的事实:在某些系统上,在某些配置中,
memset
可能比备选方案慢,可能是因为它仅在单字节上运行。自动memset替换是基于使用块存储和开关来缓存旁路的库需要的时候…小注:聪明的编译器(至少是GCC和Intel),将检测到这样的循环,并将其自动替换为
memset
。有趣的事实:在某些系统上,在某些配置中,
memset
可能比备选方案慢,可能是因为它仅在单字节上运行。自动memset替换是基于使用块存储和开关来缓存旁路的库需要时。。。