matheus__serpa

openACC

Oct 6th, 2014
560
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.20 KB | None | 0 0
  1. void saxpy_parallel(int n, float a, float *x, float *restrict y){
  2.   #pragma acc kernels
  3.   // #pragma acc parallel loop
  4.   for (int i = 0; i < n; ++i)
  5.     y[i] = a*x[i] + y[i];
  6. }
  7.  
  8. /* pgcc -I../common -acc -ta=nvidia -Minfo=accel -o laplace2d_acc laplace2d.c */
  9. // Step one
  10. #pragma omp parallel for shared(m, n, Anew, A)
  11. #pragma acc kernels
  12.  
  13. // Step two
  14. #pragma acc data copy(A, Anew)
  15. #pragma omp parallel for shared(m, n, Anew, A)
  16. #pragma acc kernels
  17.  
  18. // Step three
  19. /* The gang(32) clause on the outer loop tells the compiler to launch 32 blocks in the Y (row) direction.  Thegang(16) clause on the inner loop tells it to launch 16 blocks in the X (column) direction. The vector(16) clause on the outer loop tells the compiler to use blocks that are 16 threads tall, thus processing the loop iterations in SIMD groups of 16. Finally, the vector(32) clause on the inner loop tells the compiler to use blocks that are 32 threads wide (one warp wide). */
  20.  
  21. #pragma acc data copy(A), create(Anew)
  22. #pragma omp parallel for shared(m, n, Anew, A)
  23. #pragma acc kernels loop gang(32), vector(16)
  24.         for( int j = 1; j < n-1; j++) {
  25. #pragma acc loop gang(16), vector(32)
  26.             for( int i = 1; i < m-1; i++ )
  27.  
  28. // Step four
  29. #pragma acc data copy(A), create(Anew)
  30. #pragma omp parallel for shared(m, n, Anew, A)
  31. #pragma acc kernels loop
  32.         for( int j = 1; j < n-1; j++) {
  33. #pragma acc loop gang(16), vector(32)
  34.             for( int i = 1; i < m-1; i++ )
  35.  
  36.  
  37. void gramSchmidt(restrict float Q[][COLS], const int rows, const int cols){
  38.   float Qt[cols][rows];
  39.  
  40. #pragma acc data create(Qt[cols][rows]) copy(Q[0:rows][0:cols])
  41.   {
  42.     //transpose Q in Qt
  43. #pragma acc parallel loop
  44.     for(int i=0; i < rows; i++)
  45.       for(int j=0; j < cols; j++)
  46.     Qt[j][i] = Q[i][j];
  47.  
  48.     for(int k=0; k < cols; k++) {
  49.  
  50. #pragma acc parallel
  51.       {
  52.     double tmp = 0.;
  53.  
  54. #pragma acc loop vector reduction(+:tmp)
  55.     for(int i=0; i < rows; i++) tmp +=  (Qt[k][i] * Qt[k][i]);
  56.     tmp = sqrt(tmp);
  57.  
  58. #pragma acc loop vector
  59.     for(int i=0; i < rows; i++) Qt[k][i] /= tmp;
  60.       }
  61.  
  62. #pragma acc parallel loop vector_length(128)
  63.       for(int j=k+1; j < cols; j++) {
  64.     double tmp=0.;
  65.     for(int i=0; i < rows; i++) tmp += Qt[k][i] * Qt[j][i];
  66.     for(int i=0; i < rows; i++) Qt[j][i] -= tmp * Qt[k][i];
  67.       }
  68.     }
  69.  
  70. #pragma acc parallel loop
  71.     for(int i=0; i < rows; i++)
  72.       for(int j=0; j < cols; j++)
  73.     Q[i][j] = Qt[j][i];
  74.   }
  75. }
  76.  
  77.  
  78. void multiplicaMatriz(restrict int *A, restrict int *B, int *C){
  79.         #pragma acc data copyin(A[0:N*N], B[0:N*N]) copyout(C[0:N*N])
  80.         {
  81.                 #pragma acc region
  82.                 {
  83.                         #pragma acc loop independent vector(16)
  84.                         for(int i=0;i<N;i++){
  85.                                 #pragma acc loop independent vector(16)
  86.                                 for(int j=0;j<N;j++){
  87.                                         int sum=0;
  88.                                         #pragma acc loop
  89.                                         for(int k=0;k<N;k++){
  90.                                                 sum += + ( A[(i*N)+k] * B[(k*N)+j]);
  91.                                         }
  92.                                         C[(i*N)+j] = sum;
  93.                                 }
  94.                         }
  95.  
  96.                 }
  97.         }
  98. }
  99.  
  100.  
  101.  
  102. void par_impar(restrict int *a){
  103.         #pragma acc data copy(a[0:N])
  104.         {
  105.                 #pragma acc region
  106.                 {
  107.                         for(int j=0;j<N;j++){
  108.                                 #pragma acc loop independent vector(16)
  109.                                 for(int i=0;i<N;i=i+2){
  110.                                         if(a[i] > a[i+1]){
  111.                                                 int swap = a[i];
  112.                                                 a[i] = a[i+1];
  113.                                                 a[i+1] = swap;
  114.  
  115.                                         }
  116.                                 }
  117.                                 #pragma acc loop independent vector(16)
  118.                                 for(int i=1;i<N-1;i=i+2){
  119.                                         if(a[i] > a[i+1]){
  120.                                                 int swap = a[i];
  121.                                                 a[i] = a[i+1];
  122.                                                 a[i+1] = swap;
  123.                                         }
  124.                                 }
  125.                         }
  126.                 }
  127.         }
  128. }
  129.  
  130.  
  131. void matvecmul( float* x, float* a, float* v, int m, int n ){
  132.         #pragma acc parallel loop gang
  133.         for( int i = 0; i < m; ++i ){
  134.                 float xx = 0.0;
  135.                 #pragma acc loop worker reduction(+:xx)
  136.                 for( int j = 0; j < n; ++j )
  137.                         xx += a[i*n+j]*v[j];
  138.                 x[i] = xx;
  139.         }
  140. }
  141.  
  142.  
  143. void matvecmul( float* x, float* a, float* v, int m, int n ){
  144.         #pragma acc parallel loop gang copyin(a[0:n*m],v[0:n]) copyout(x[0:m])
  145.         for( int i = 0; i < m; ++i ){
  146.                 float xx = 0.0;
  147.                 #pragma acc loop worker reduction(+:xx)
  148.                 for( int j = 0; j < n; ++j )
  149.                         xx += a[i*n+j]*v[j];
  150.                 x[i] = xx;
  151.         }
  152. }
  153.  
  154. void matvecmul( float* x, float* a, float* v, int m, int n ){
  155.         #pragma acc parallel loop gang pcopyin(a[0:n*m],v[0:n]) pcopyout(x[0:m])
  156.         for( int i = 0; i < m; ++i ){
  157.                 float xx = 0.0;
  158.                 #pragma acc loop worker reduction(+:xx)
  159.                 for( int j = 0; j < n; ++j )
  160.                         xx += a[i*n+j]*v[j];
  161.                 x[i] = xx;
  162.         }
  163. }
  164.  
  165.  
  166. #pragma acc routine worker
  167. void matvec( float* v, float* x, float* a, int i, int n ){
  168.         float xx = 0;
  169.         #pragma acc loop reduction(+:xx)
  170.         for( int j = 0; j < n; ++j )
  171.                 xx += a[i*n+j]*v[j];
  172.         x[i] = xx;
  173. }
  174.  
  175. #pragma acc data copy(a0[0:sz*sz*sz]), create(a1[0:sz*sz*sz], i,j,k,iter), copyin(sz,fac,n)
  176.   {
  177.  
  178.     for (iter = 0; iter < ITERATIONS; iter++) {
  179. #pragma acc parallel loop
  180.       for (i = 1; i < n+1; i++) {
  181. #pragma acc loop
  182.         for (j = 1; j < n+1; j++) {
  183. #pragma acc loop
  184.           for (k = 1; k < n+1; k++) {
Advertisement
Add Comment
Please, Sign In to add comment