2016-09-11 1 views
0

Ich versuchte Matrix mal Vektor mit vieler Schleife zu machen, und ich will den Prozess zur BeschleunigungC mit OpenMP: Matrix mal Vektor

Hier ist mein Code

#include <stdio.h> 
#include <time.h> 
#include <omp.h> 

int main() 
{ 
    int i, j, n, a[719][719], b[719], c[719]; 

    clock_t start = clock(); 

    n = 100; //Max 719 

    printf("Matrix A\n"); 

    for (i = 0; i < n; ++i) { 
     for (j = 0; j < n; ++j) { 
      a[i][j] = 10; 
      printf("%d ", a[i][j]); 
     } 
     printf("\n"); 
    } 

    printf("\nMatrix B\n"); 

    #pragma omp parallel private(i) shared(b) 
    { 
     #pragma omp for 
     for (i = 0; i < n; ++i) { 
      b[i] = 5; 
      printf("%d\n", b[i]); 
     } 
    } 

    printf("\nA * B\n"); 

    #pragma omp parallel private(i) shared(c) 
    { 
     #pragma omp for 
     for (i = 0; i < n; ++i) { 
      c[i] = 0; 
     } 
    } 

    #pragma omp parallel private(i,j) shared(n,a,b,c) 
    { 
     #pragma omp for schedule(dynamic) 
     for (i = 0; i < n; ++i) { 
      for (j = 0; j < n; ++j) { 
       c[i] += b[j] * a[j][i]; 
      } 
     } 
    } 


    #pragma omp parallel private(i) shared(c) 
    { 
     #pragma omp for 
     for (i = 0; i < n; ++i) { 
      printf("%d\n", c[i]); 
     } 
    } 

    clock_t stop = clock(); 
    double elapsed = (double)(stop - start)/CLOCKS_PER_SEC; 
    printf("\nTime elapsed: %.5f\n", elapsed); 

    return 0; 
} 

Ich denke auch, dass es eine Viele ineffektive Teil in diesem Code, würde ich es begrüßen, wenn jemand den Code in den effektiven beheben und den Prozess beschleunigen könnte

+0

'c [i] + = b [j] * a [j] [i]' es ist Cache unfreundlich, über den ersten Index zu gehen, den du machen willst 'c [i] + = b [j] * a [ i] [j] '. In jedem Fall, selbst wenn Sie es richtig machen, ist es Speicherbandbreite gebunden. –

Antwort

0

Ich warne Sie, dass ich vor kurzem versucht, eine ähnliche Sache zu machen (Matrix Multiplikation) und ich didn bekomme nicht die erhofften ergebnisse: mit zwei kernen und hyperthreading lief ich Das Programm und die Beschleunigung gegenüber der linearen Implementierung war sehr klein und nur mit Matrizen sehr groß. Bei Matrizen kleiner Größe verlangsamen Sie Ihren Algorithmus nur aufgrund von Thread-Overhead.

Sie können die collapse(n) Anweisung verwenden. Das Threading wird auf die verschachtelten Schleifen angewendet. Sie sollten Ihren Overhead reduzieren. Einen schnellen Überblick über OpenMP-Richtlinien finden Sie hier (auch zusammenklappen): http://bisqwit.iki.fi/story/howto/openmp/.

Sie können den Code überprüfen, schrieb ich hier: http://pastebin.com/edi4DgrJ Sie können zur Kompilierungszeit die Größe der Matrizen definieren. Ändern Sie einfach die Definition.

Sie können auch "kondensierte" OpenMP-Anweisungen (wie parallel for) verwenden, die Ihre Programmiersitzung beschleunigen (und ich denke auch, dass die Lesbarkeit des Codes besser ist).