Q1: OpenBLAS Q2: task Q3: // Shearsort, OMP version // note: p.259 assumes row numbers start at 1, but here start at 0 #include #include #include // copy ncpy ints from source, stride stridesrc, // to destination, stride stridedst void memorycpy(int *dst, int *src, int ncpy, int stridedst, int stridesrc) { for (int i = 0; i < ncpy; i++) dst[i*stridedst] = src[i*stridesrc]; } int upComp(int *u, int *v) {return (*u - *v); } // ascending int downComp(int *u, int *v) {return (*v - *u); } // descending // array x, length nx5^2 void shear(int *x, int nx5) { int nx = nx5 * nx5; int i,nIters = 0; for (i = 2; ; i = 2 * i) { // OMSI doesn't do -lm, so need this nIters++; if (i >= nx) break; } nIters = nIters + 1; #pragma omp parallel { int iter; int *tmp = malloc(nx5 * sizeof(int)); // temp storage for columns for (iter = 1; iter <= nIters; iter++) { if (iter % 2 == 1) { #pragma omp for for (int Row = 0; Row < nx5; Row++) { // if even, sort ascending else descending if (Row % 2) qsort(&x[Row*nx5],nx5,sizeof(int),downComp); else qsort(&x[Row*nx5],nx5,sizeof(int),upComp); } } else { #pragma omp for for (int Col = 0; Col < nx5; Col++) { memorycpy(tmp,&x[Col],nx5,1,nx5); qsort(tmp,nx5,sizeof(int),upComp); memorycpy(&x[Col],tmp,nx5,nx5,1); } } #pragma omp barrier } } } int main() { int z[9] = {5,12,13,6,2,22,15,3,7}; omp_set_num_threads(2); shear(z,3); for (int i = 0; i < 9; i++) printf("%d ",z[i]); printf("\n"); }