matheus__serpa icon

xeon_phi

matheus__serpa | PRO | 10/03/14 04:03:30 PM UTC | 0 ⭐ | 385 👁️ | Never ⏰ | []
C |

2.82 KB

|

None

|

0 👍

/

0 👎

// compile for host-based OpenMP
// icc -mkl -Ofast -no-offload -openmp -Wno-unknown-pragmas -std=c99 -vec-report3 matrix.c -o matrix.omp
 
// compile for offload mode
//icc -mkl -Ofast -offload-build -Wno-unknown-pragmas -std=c99 -vec-report3 matrix.c -o matrix.off 
 
// compile to run natively on the Xeon Phi
//icc -mkl -Ofast -mmic -openmp -L  /opt/intel/lib/mic -Wno-unknown-pragmas -std=c99 -vec-report3 matrix.c -o matrix.mic -liomp5
 
// export PHI_OMP_NUM_THREADS=240
// export PHI_KMP_AFFINITY="granularity=thread,balanced"
// export LD_LIBRARY_PATH=/tmp
 
float (*restrict A)[size] = malloc(sizeof(float)*size*size);
 
void doMult(int size, float (* restrict A)[size], float (* restrict B)[size], float (* restrict C)[size]){
 
#pragma offload target(mic:0) in(A:length(size*size)) in( B:length(size*size)) out(C:length(size*size))
  {
#pragma omp parallel for default(none) shared(A, B, C, size)
    for (int i = 0; i < size; ++i)
      for (int k = 0; k < size; ++k)
        for (int j = 0; j < size; ++j)
          C[i][j] += A[i][k] * B[k][j];
  }
 
}
 
 
// nowait_example
#pragma omp parallel
{
#pragma omp for schedule(static) nowait
for (i=0; i<n; i++)
 c[i] = (a[i] + b[i]) / 2.0f;
 
#pragma omp for schedule(static) nowait
for (i=0; i<n; i++)
 z[i] = sqrtf(c[i]);
 
#pragma omp for schedule(static) nowait 
for (i=1; i<=n; i++) 
 y[i] = z[i-1] + a[i];
}
 
// collapse
 #pragma omp parallel
 {
 #pragma omp for collapse(2) lastprivate(jlast, klast)
 for (k=1; k<=2; k++)
  for (j=1; j<=3; j++){
   jlast=j;
   klast=k;
  }
 #pragma omp single
 printf("%d %d\n", klast, jlast);
 }
 
// section
 #pragma omp parallel sections
 {
 #pragma omp section
 XAXIS();
 #pragma omp section
 YAXIS();
 #pragma omp section
 ZAXIS();
 }
 
 
// task 1
void postorder_traverse( struct node *p ) {
 if (p->left)
  #pragma omp task // p is firstprivate by default
   postorder_traverse(p->left);
 if (p->right)
  #pragma omp task // p is firstprivate by default
   postorder_traverse(p->right);
 #pragma omp taskwait
 process(p);
}
 
 
 
// task 2
void process(node * p)
{
 /* do work here */
}
 
void increment_list_items(node * head)
{
 #pragma omp parallel
 {
  #pragma omp single
  {
   node * p = head;
   while (p) {
    #pragma omp task
    // p is firstprivate by default
     process(p);
     p = p->next;
  }
 }
}
 
 
// task 3
 
int fib(int n) { 
 int i, j; 
 if (n < 2) 
  return n; 
 else { 
  #pragma omp task shared(i) 
  i = fib(n-1); 
  #pragma omp task shared(j) 
  j = fib(n-2); 
  #pragma omp taskwait 
  return i+j; 
  } 
}
 
// Reduction
 #pragma omp parallel for private(i) shared(x, y, n) reduction(+:a) reduction(^:b) reduction(min:c) reduction(max:d)
 for (i=0; i<n; i++) {
  a += x[i];
  b ^= y[i];
  if (c > y[i]) 
   c = y[i];
  d = fmaxf(d,x[i]);
}

Comments