2017-03-01 34 views
0

結果我乘的是像C++並行矩陣乘法,計算不正確

-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; 
} 
+1

不是一個解決方案,但您當前輸出的十六進制是0xFFFFFFFFCDCDCDCD。在visual studio下,0xCD是未初始化的內存。 –

+2

嘗試在您的'omp parallel for'指令中添加'private(k)'作爲啓動程序... – Gilles

+1

Ho和BTW,'rand()'不是線程安全的,因此無論如何您都將擁有不可重複的結果 – Gilles

回答

4

你沒有初始化的矩陣C,但是你用「+ =」操作符,增加值,以隨機inital值矩陣C.所以,你需要這樣的第一:

for (int i = 0; i < Am; i++) 
{ 
    for (int j = 0; j < Bn; j++) 
    { 
     C[ i ][ j ] = 0.0; 
    } 
} 

或者,您可以使用memset/setmem C函數(取決於您的系統),其中可以更快地使用 。

順便說一句,不要在並行循環中使用'cout',結果可能會令人困惑。

+0

小備註:聰明的編譯器(至少GCC和英特爾),將檢測這樣一個循環,並用'memset'自動替換它。有趣的事實:在某些系統中,在一些配置中,memset可能比替代方法慢,大概是因爲它只對單個字節進行操作。 – Zulan

+0

感謝您的幫助。 – blazelott

+0

如果可以,請標記爲「已回答」。 – Trantor