CSC/ECE 506 Spring 2015/37 mr: Difference between revisions
		
		
		
		Jump to navigation
		Jump to search
		
| (4 intermediate revisions by the same user not shown) | |||
| Line 10: | Line 10: | ||
The code to parallelize:  | The code to parallelize:  | ||
  int main()  |   int main()  | ||
  {  |   {  | ||
       omp_set_num_threads(6);  | |||
       long sum = 1;  | |||
       int size = 5;  | |||
       int i, j, rowsum;  | |||
       int first[5][5] = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 }, {16, 17, 18, 19, 20}, {21, 22, 23, 24, 25} };  | |||
       for ( i = 0 ; i < size ; i++ ){  | |||
               rowsum = 0;  | |||
               for ( j = 0 ; j < size ; j++ ){  | |||
                       rowsum = rowsum + first[i][j];  | |||
               }  | |||
               sum = rowsum*sum;  | |||
       }  | |||
       printf("sum: %d\n", sum);  | |||
    return 0;  | |||
  }  |   }  | ||
== Answer 1 ==  | == Answer 1 ==  | ||
  int main()  |   int main()  | ||
  {  |   {  | ||
        omp_set_num_threads(6);  | |||
        long sum = 1;  | |||
         int size = 5;  |          int size = 5;  | ||
         int i, j;  |          int i, j, rowsum;  | ||
  #pragma omp parallel shared(rowsum, i, sum) private(j)  | |||
  {  | |||
         int first[5][5] = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 }, {16, 17, 18, 19, 20}, {21, 22, 23, 24, 25} };  |          int first[5][5] = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 }, {16, 17, 18, 19, 20}, {21, 22, 23, 24, 25} };  | ||
         #pragma omp for  | |||
         #pragma omp   | |||
         for ( i = 0 ; i < size ; i++ ){  |          for ( i = 0 ; i < size ; i++ ){  | ||
                rowsum = 0;  | |||
                 for ( j = 0 ; j < size ; j++ ){  |                  for ( j = 0 ; j < size ; j++ ){  | ||
                         rowsum = rowsum + first[i][j];  | |||
                 }  |                  }  | ||
                #pragma omp critical  | |||
                sum = rowsum*sum;  | |||
         }  |          }  | ||
  }  | |||
         printf("sum: %d\n", sum);  | |||
     return 0;  | |||
         printf("  | |||
  }  |   }  | ||
Latest revision as of 04:49, 3 February 2015
A (simple) Introduction to OpenMP
How to run the samples on EOS
gcc -fopenmp hello.c -o hello
Question 1
Parallelize the following code using OpenMP
The code to parallelize:
int main()
{
      omp_set_num_threads(6);
      long sum = 1;
      int size = 5;
      int i, j, rowsum;
      int first[5][5] = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 }, {16, 17, 18, 19, 20}, {21, 22, 23, 24, 25} };
      for ( i = 0 ; i < size ; i++ ){
              rowsum = 0;
              for ( j = 0 ; j < size ; j++ ){
                      rowsum = rowsum + first[i][j];
              }
              sum = rowsum*sum;
      }
      printf("sum: %d\n", sum);
   return 0;
}
Answer 1
int main()
{
       omp_set_num_threads(6);
       long sum = 1;
       int size = 5;
       int i, j, rowsum;
 #pragma omp parallel shared(rowsum, i, sum) private(j)
 {
       int first[5][5] = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 }, {16, 17, 18, 19, 20}, {21, 22, 23, 24, 25} };
       #pragma omp for
       for ( i = 0 ; i < size ; i++ ){
               rowsum = 0;
               for ( j = 0 ; j < size ; j++ ){
                       rowsum = rowsum + first[i][j];
               }
               #pragma omp critical
               sum = rowsum*sum;
       }
 }
       printf("sum: %d\n", sum);
    return 0;
}
Question 2
Parallelize the code below using loop distribution
for (i=0; i<n; i++) { 
S1:  a[i] = b[i-1] * a[i+1];
S2:  b[i] = b[i] * 3;
S3:  c[i] = .2 * (c[i-1] * c[i]);
} 
After loop distribution
for(i=0; i < n; i++) S1: a[i] = b[i-1] * a[i+1]; for(i=0; i < n; i++) S3: c[i] = .2* c[i-1] * c[i]; for(i=0; i < n; i++) S2: b[i] = b[i] * 3;
Now write the parallelized code in openMP using C++
#pragma omp parallel shared(a,b,c)private(i) {
 #pragma omp sections nowait
 {
       #pragma omp section
       for(i=0; i < n; i++)
         a[i] = b[i-1] * a[i+1];
       #pragma omp section
       for(i=0; i<n; i++)
        c[i] = .2* c[i-1]*c[i];
       #pragma omp section
       for(i=0; i < n; i++)
        b[i] = b[i] * 3;
  }//end omp sections
} //end omp parallel