Skip to content

Commit 9e0ee0e

Browse files
authoredAug 15, 2024
[OpenMP] Add support for pause with omp_pause_stop_tool (#97100)
This patch adds support for pause resource with a new enumerator omp_pause_stop_tool. The expected behavior of this enumerator is * omp_pause_resource: not allowed * omp_pause_resource_all: equivalent to omp_pause_hard
1 parent b6bb208 commit 9e0ee0e

File tree

7 files changed

+55
-3
lines changed

7 files changed

+55
-3
lines changed
 

‎openmp/runtime/src/include/omp.h.var

+2-1
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,8 @@
476476
typedef enum omp_pause_resource_t {
477477
omp_pause_resume = 0,
478478
omp_pause_soft = 1,
479-
omp_pause_hard = 2
479+
omp_pause_hard = 2,
480+
omp_pause_stop_tool = 3
480481
} omp_pause_resource_t;
481482
extern int __KAI_KMPC_CONVENTION omp_pause_resource(omp_pause_resource_t, int);
482483
extern int __KAI_KMPC_CONVENTION omp_pause_resource_all(omp_pause_resource_t);

‎openmp/runtime/src/include/omp_lib.F90.var

+1
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@
192192
integer (kind=omp_pause_resource_kind), parameter, public :: omp_pause_resume = 0
193193
integer (kind=omp_pause_resource_kind), parameter, public :: omp_pause_soft = 1
194194
integer (kind=omp_pause_resource_kind), parameter, public :: omp_pause_hard = 2
195+
integer (kind=omp_pause_resource_kind), parameter, public :: omp_pause_stop_tool = 3
195196

196197
integer (kind=omp_interop_fr_kind), parameter, public :: omp_ifr_cuda = 1
197198
integer (kind=omp_interop_fr_kind), parameter, public :: omp_ifr_cuda_driver = 2

‎openmp/runtime/src/include/omp_lib.h.var

+2
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,8 @@
248248
parameter(omp_pause_soft=1)
249249
integer(kind=omp_pause_resource_kind)omp_pause_hard
250250
parameter(omp_pause_hard=2)
251+
integer(kind=omp_pause_resource_kind)omp_pause_stop_tool
252+
parameter(omp_pause_stop_tool=3)
251253

252254
integer(kind=omp_interop_fr_kind)omp_ifr_cuda
253255
parameter(omp_ifr_cuda=1)

‎openmp/runtime/src/kmp.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -4552,7 +4552,8 @@ extern int __kmpc_get_target_offload();
45524552
typedef enum kmp_pause_status_t {
45534553
kmp_not_paused = 0, // status is not paused, or, requesting resume
45544554
kmp_soft_paused = 1, // status is soft-paused, or, requesting soft pause
4555-
kmp_hard_paused = 2 // status is hard-paused, or, requesting hard pause
4555+
kmp_hard_paused = 2, // status is hard-paused, or, requesting hard pause
4556+
kmp_stop_tool_paused = 3 // requesting stop_tool pause
45564557
} kmp_pause_status_t;
45574558

45584559
// This stores the pause state of the runtime

‎openmp/runtime/src/kmp_ftn_entry.h

+2
Original file line numberDiff line numberDiff line change
@@ -1427,6 +1427,8 @@ int FTN_STDCALL KMP_EXPAND_NAME(FTN_PAUSE_RESOURCE)(kmp_pause_status_t kind,
14271427
#ifdef KMP_STUB
14281428
return 1; // just fail
14291429
#else
1430+
if (kind == kmp_stop_tool_paused)
1431+
return 1; // stop_tool must not be specified
14301432
if (device_num == KMP_EXPAND_NAME(FTN_GET_INITIAL_DEVICE)())
14311433
return __kmpc_pause_resource(kind);
14321434
else {

‎openmp/runtime/src/kmp_runtime.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -9132,7 +9132,8 @@ int __kmp_pause_resource(kmp_pause_status_t level) {
91329132
__kmp_soft_pause();
91339133
return 0;
91349134
}
9135-
} else if (level == kmp_hard_paused) { // requesting hard pause
9135+
} else if (level == kmp_hard_paused || level == kmp_stop_tool_paused) {
9136+
// requesting hard pause or stop_tool pause
91369137
if (__kmp_pause_status != kmp_not_paused) {
91379138
// error message about already being paused
91389139
return 1;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// RUN: %libomp-compile-and-run | FileCheck %s
2+
// REQUIRES: ompt
3+
#include "callback.h"
4+
#include <omp.h>
5+
int main() {
6+
int x = 0;
7+
int ret = 0;
8+
#pragma omp parallel
9+
#pragma omp single
10+
x++;
11+
// Expected to fail; omp_pause_stop_tool must not be specified
12+
ret = omp_pause_resource(omp_pause_stop_tool, omp_get_initial_device());
13+
printf("omp_pause_resource %s\n", ret ? "failed" : "succeeded");
14+
#pragma omp parallel
15+
#pragma omp single
16+
x++;
17+
// Expected to succeed
18+
ret = omp_pause_resource_all(omp_pause_stop_tool);
19+
printf("omp_pause_resource_all %s\n", ret ? "failed" : "succeeded");
20+
#pragma omp parallel
21+
#pragma omp single
22+
x++;
23+
printf("x = %d\n", x);
24+
return 0;
25+
26+
// Check if
27+
// -- omp_pause_resource/resource_all returns expected code
28+
// -- OMPT interface is shut down as expected
29+
30+
// CHECK-NOT: {{^}}0: Could not register callback
31+
// CHECK: 0: NULL_POINTER=[[NULL:.*$]]
32+
33+
// CHECK: ompt_event_parallel_begin
34+
// CHECK: ompt_event_parallel_end
35+
36+
// CHECK: omp_pause_resource failed
37+
38+
// CHECK: ompt_event_parallel_begin
39+
// CHECK: ompt_event_parallel_end
40+
41+
// CHECK: omp_pause_resource_all succeeded
42+
43+
// CHECK-NOT: ompt_event
44+
}

0 commit comments

Comments
 (0)
Please sign in to comment.