#include #ifdef _OPENMP #include #endif //počet prvkov poľa #define MAX 10 int main(int argc, char* argv[]) { float a[MAX] = {1.4, 1.2, 1.1, 1.1, 0.47, 0.99, 7.86, 2.3, 9.0, 6.7}; float b[MAX]; int idx[MAX]; int i, j; double start, stop; #pragma omp parallel { //začiatok paralelnej oblasti #ifdef _OPENMP //začiatok merania času start = omp_get_wtime(); #endif //paralelne vykonávané iterácie cyklu #pragma omp for for(i = 0; i < MAX; i++) { idx[i] = 0; } //paralelne vykonávané iterácie 2 vnorených cyklov #pragma omp for collapse(2) private(i, j) for(i = 0; i < MAX; i++) { for(j = 0; j < MAX; j++) { if((a[i] > a[j]) || ((a[i] == a[j]) && (i > j))) { //v kritickej oblasti sa môže nachádzať len 1 vlákno #pragma omp critical idx[i]++; } } } //paralelne vykonávané iterácie cyklu #pragma omp for for(i = 0; i < MAX; i++) { b[idx[i]] = a[i]; } #ifdef _OPENMP //koniec merania času stop = omp_get_wtime(); #endif //paralelne vykonávané iterácie cyklu v poradí iterácií #pragma omp for ordered for(i = 0; i < MAX; i++) { #pragma omp ordered printf("%6.2f", b[i]); } //oblasť single vykoná len 1 vlákno #pragma omp single printf("\n"); } //koniec paralelnej oblasti #ifdef _OPENMP printf("Cas: %.9f s\nPresnost: %e s\n", stop - start, omp_get_wtick()); #endif return 0; }