2017-07-10 4 views
2
abgebrochen

Ich versuche Matrixmultiplikation auszuführen OpenMP wie folgt verwendet, und ich kompilieren GCC: g++ -std=gnu++11 -g -Wall -fopenmp -o parallel_not_opt parallel_not_opt.cppOpenMP-Code wird

Aber wenn ich versuche, es zu laufen von parallel_not_opt.exe verwenden, bricht es den typischen Windows-Fehler geben parallel_not_opt.exe hat aufgehört zu arbeiten ...

Fehle ich etwas?

#include "includes/stdafx.h" 

#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <vector> 
# include <omp.h> 
#include <chrono> 
#include <fstream> 
#include <algorithm> 
#include <immintrin.h> 
#include <cfloat> 
#include <limits> 
#include <math.h> 

using namespace std::chrono; 
using namespace std; 


//populate matrix with random values. 
double** generateMatrix(int n){ 
    double max = DBL_MAX; 
    double min = DBL_MIN; 
    double** matA = new double*[n]; 
    for (int i = 0; i < n; i++) { 
     matA[i] = new double[n]; 
     for (int j = 0; j < n; j++) { 
      double randVal = (double)rand()/RAND_MAX; 
      matA[i][j] = min + randVal * (max - min); 
     } 
    } 
    return matA; 
} 

//generate matrix for final result. 
double** generateMatrixFinal(int n){ 
    double** matA = new double*[n]; 
    for (int i = 0; i < n; i++) { 
     matA[i] = new double[n]; 
     for (int j = 0; j < n; j++) { 
      matA[i][j] = 0; 
     } 
    } 
    return matA; 
} 

//matrix multiplication - parallel 
double matrixMultiplicationParallel(double** A, double** B, double** C, int n){ 
    int i, j, k; 
    clock_t begin_time = clock(); 
# pragma omp parallel shared (A,B,C,n ) // private (i, j, k) 
    { 
# pragma omp for 
     for (i = 0; i < n; i++) { 
      //   cout<< i << ", " ; 
      for (j = 0; j < n; j++) { 
       for (k = 0; k < n; k++) { 
        C[i][j] += A[i][k] * B[k][j]; 
       } 
      } 
     } 
    } 
    double t = float(clock() - begin_time); 
    return t; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    ofstream out("output.txt", ios::out | ios::app); 
    out << "--------------STARTED--------------" << "\n"; 
    int start = 200, stop = 2000, step = 200; 

    for (int n = start; n <= stop; n += step) 
    { 

     srand(time(NULL)); 
     cout << "\nn: " << n << "\n"; 
     double t1 = 0; 

     int my_size = n; 
     double **A = generateMatrix(my_size); 
     double **B = generateMatrix(my_size); 
     double **C = generateMatrixFinal(my_size); 
     double single_sample_time = matrixMultiplicationParallel(A, B, C, n);  
     t1 += single_sample_time; 
     for (int i = 0; i < n; i++) { 
      delete[] A[i]; 
      delete[] B[i]; 
      delete[] C[i]; 
     } 
     delete[] A; 
     delete[] B; 
     delete[] C;   
    } 
    out << "-----------FINISHED-----------------" << "\n"; 
    out.close(); 
    return 0; 
} 
+2

Verwenden Sie einen Debugger und lokalisieren Sie den Fehler. Es ist schwierig, den Fehler zu finden, ohne ihn zu debuggen. Und noch etwas, überprüfen Sie, ob Ihr Compiler openMP unterstützt. Nicht alle Compiler implementieren openMP. –

+0

@ShanilFernando Aber es läuft korrekt in Visual Studio, ich versuche, es mit CMD ausführen und diesen Fehler erhalten. – SachiDangalla

+0

Hat es kompiliert, um zu veröffentlichen? Visual Studio Compiler ist nicht gcc standardmäßig –

Antwort

2

Die Deklaration private (i, j, k) ist nicht optional. Fügen Sie es zurück, ansonsten werden die inneren Loop-Variablen j und k gemeinsam genutzt, was die inneren Schleifen komplett durcheinander bringt.

Es ist besser, Variablen so lokal wie möglich zu deklarieren. Das macht Argumentation über OpenMP Code viel einfacher:

clock_t begin_time = clock(); 
# pragma omp parallel 
{ 
# pragma omp for 
    for (int i = 0; i < n; i++) { 
     for (int j = 0; j < n; j++) { 
      for (int k = 0; k < n; k++) { 
       C[i][j] += A[i][k] * B[k][j]; 
      } 
     } 
    } 
} 
return float(clock() - begin_time); 

In diesem Fall wird A,B,C standardmäßig freigegeben werden - von außen kommen, und j,k sind privat, weil sie in der parallelen Rahmen deklariert sind. Die Schleifenvariable einer parallel for ist immer implizit privat.

Verwandte Themen