148ca3a5eSJoel E. Denny // Check that omp atomic is permitted and behaves when strictly nested within 248ca3a5eSJoel E. Denny // omp teams. This is an extension to OpenMP 5.2 and is enabled by default. 348ca3a5eSJoel E. Denny 448ca3a5eSJoel E. Denny // RUN: %libomp-compile-and-run | FileCheck %s 5*7e894201SShilei Tian // GCC has really limited OpenMP 5.2 support yet. 6*7e894201SShilei Tian // UNSUPPORTED: gcc 748ca3a5eSJoel E. Denny 848ca3a5eSJoel E. Denny #include <omp.h> 948ca3a5eSJoel E. Denny #include <stdbool.h> 1048ca3a5eSJoel E. Denny #include <stdio.h> 1148ca3a5eSJoel E. Denny #include <string.h> 1248ca3a5eSJoel E. Denny 1348ca3a5eSJoel E. Denny // High parallelism increases our chances of detecting a lack of atomicity. 1448ca3a5eSJoel E. Denny #define NUM_TEAMS_TRY 256 1548ca3a5eSJoel E. Denny main()1648ca3a5eSJoel E. Dennyint main() { 1748ca3a5eSJoel E. Denny // CHECK: update: num_teams=[[#NUM_TEAMS:]]{{$}} 1848ca3a5eSJoel E. Denny // CHECK-NEXT: update: x=[[#NUM_TEAMS]]{{$}} 1948ca3a5eSJoel E. Denny int x = 0; 2048ca3a5eSJoel E. Denny int numTeams; 2148ca3a5eSJoel E. Denny #pragma omp teams num_teams(NUM_TEAMS_TRY) 2248ca3a5eSJoel E. Denny { 2348ca3a5eSJoel E. Denny #pragma omp atomic update 2448ca3a5eSJoel E. Denny ++x; 2548ca3a5eSJoel E. Denny if (omp_get_team_num() == 0) 2648ca3a5eSJoel E. Denny numTeams = omp_get_num_teams(); 2748ca3a5eSJoel E. Denny } 2848ca3a5eSJoel E. Denny printf("update: num_teams=%d\n", numTeams); 2948ca3a5eSJoel E. Denny printf("update: x=%d\n", x); 3048ca3a5eSJoel E. Denny 3148ca3a5eSJoel E. Denny // CHECK-NEXT: capture: x=[[#NUM_TEAMS]]{{$}} 3248ca3a5eSJoel E. Denny // CHECK-NEXT: capture: xCapturedCount=[[#NUM_TEAMS]]{{$}} 3348ca3a5eSJoel E. Denny bool xCaptured[numTeams]; 3448ca3a5eSJoel E. Denny memset(xCaptured, 0, sizeof xCaptured); 3548ca3a5eSJoel E. Denny x = 0; 3648ca3a5eSJoel E. Denny #pragma omp teams num_teams(NUM_TEAMS_TRY) 3748ca3a5eSJoel E. Denny { 3848ca3a5eSJoel E. Denny int v; 3948ca3a5eSJoel E. Denny #pragma omp atomic capture 4048ca3a5eSJoel E. Denny v = x++; 4148ca3a5eSJoel E. Denny xCaptured[v] = true; 4248ca3a5eSJoel E. Denny } 4348ca3a5eSJoel E. Denny printf("capture: x=%d\n", x); 4448ca3a5eSJoel E. Denny int xCapturedCount = 0; 4548ca3a5eSJoel E. Denny for (int i = 0; i < numTeams; ++i) { 4648ca3a5eSJoel E. Denny if (xCaptured[i]) 4748ca3a5eSJoel E. Denny ++xCapturedCount; 4848ca3a5eSJoel E. Denny } 4948ca3a5eSJoel E. Denny printf("capture: xCapturedCount=%d\n", xCapturedCount); 5048ca3a5eSJoel E. Denny return 0; 5148ca3a5eSJoel E. Denny } 52