/* * @@name: taskloop_simd_reduction.1c * @@type: C * @@compilable: yes * @@linkable: yes * @@expect: success */ #include <stdio.h> #define N 100 int main(){ int i, a[N], asum=0; for(i=0;i<N;i++) a[i]=i; // taskloop reductions #pragma omp parallel master #pragma omp taskloop reduction(+:asum) //taskloop 1 for(i=0;i<N;i++){ asum += a[i]; } #pragma omp parallel reduction(task, +:asum) // parallel reduction a { #pragma omp master #pragma omp task in_reduction(+:asum) //task 2 for(i=0;i<N;i++){ asum += a[i]; } #pragma omp master taskloop in_reduction(+:asum) //taskloop 2 for(i=0;i<N;i++){ asum += a[i]; } } // taskloop simd reductions #pragma omp parallel master #pragma omp taskloop simd reduction(+:asum) //taskloop simd 3 for(i=0;i<N;i++){ asum += a[i]; } #pragma omp parallel reduction(task, +:asum) // parallel reduction b { #pragma omp master #pragma omp task in_reduction(+:asum) //task 4 for(i=0;i<N;i++){ asum += a[i]; } #pragma omp master taskloop simd in_reduction(+:asum) //taskloop simd 4 for(i=0;i<N;i++){ asum += a[i]; } } printf("asum=%d \n",asum); // output: asum=29700 }