xref: /llvm-project/openmp/runtime/test/teams/teams-atomic.c (revision 7e89420116c91647db340a4457b8ad0d60be1d5e)
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. Denny int 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