57 lines
1.1 KiB
C
57 lines
1.1 KiB
C
// RUN: %libomp-compile-and-run
|
|
// critial with hint was introduced with icc 19
|
|
// UNSUPPORTED: icc-18
|
|
|
|
#include <stdio.h>
|
|
#include <omp.h>
|
|
#include "omp_testsuite.h"
|
|
|
|
int test_omp_critical(int iter) {
|
|
int sum;
|
|
int known_sum;
|
|
|
|
sum = 0;
|
|
#pragma omp parallel
|
|
{
|
|
int mysum = 0;
|
|
int i;
|
|
#pragma omp for
|
|
for (i = 0; i < 1000; i++)
|
|
mysum = mysum + i;
|
|
|
|
switch (iter % 4) {
|
|
case 0:
|
|
#pragma omp critical(c0) hint(omp_sync_hint_uncontended)
|
|
sum = mysum + sum;
|
|
break;
|
|
case 1:
|
|
#pragma omp critical(c1) hint(omp_sync_hint_contended)
|
|
sum = mysum + sum;
|
|
break;
|
|
case 2:
|
|
#pragma omp critical(c2) hint(omp_sync_hint_nonspeculative)
|
|
sum = mysum + sum;
|
|
break;
|
|
case 3:
|
|
#pragma omp critical(c3) hint(omp_sync_hint_speculative)
|
|
sum = mysum + sum;
|
|
break;
|
|
default:;
|
|
}
|
|
}
|
|
known_sum = 999 * 1000 / 2;
|
|
return (known_sum == sum);
|
|
}
|
|
|
|
int main() {
|
|
int i;
|
|
int num_failed = 0;
|
|
|
|
for (i = 0; i < 4 * REPETITIONS; i++) {
|
|
if (!test_omp_critical(i)) {
|
|
num_failed++;
|
|
}
|
|
}
|
|
return num_failed;
|
|
}
|