16 #include "ompt-specific.h" 32 kmp_int32 __kmpc_cancel(
ident_t *loc_ref, kmp_int32 gtid, kmp_int32 cncl_kind) {
33 kmp_info_t *this_thr = __kmp_threads[gtid];
35 KC_TRACE(10, (
"__kmpc_cancel: T#%d request %d OMP_CANCELLATION=%d\n", gtid,
36 cncl_kind, __kmp_omp_cancellation));
38 KMP_DEBUG_ASSERT(cncl_kind != cancel_noreq);
39 KMP_DEBUG_ASSERT(cncl_kind == cancel_parallel || cncl_kind == cancel_loop ||
40 cncl_kind == cancel_sections ||
41 cncl_kind == cancel_taskgroup);
42 KMP_DEBUG_ASSERT(__kmp_get_gtid() == gtid);
44 if (__kmp_omp_cancellation) {
52 kmp_team_t *this_team = this_thr->th.th_team;
53 KMP_DEBUG_ASSERT(this_team);
54 kmp_int32 old = cancel_noreq;
55 this_team->t.t_cancel_request.compare_exchange_strong(old, cncl_kind);
56 if (old == cancel_noreq || old == cncl_kind) {
59 #if OMPT_SUPPORT && OMPT_OPTIONAL 60 if (ompt_enabled.ompt_callback_cancel) {
61 ompt_data_t *task_data;
62 __ompt_get_task_info_internal(0, NULL, &task_data, NULL, NULL,
64 ompt_cancel_flag_t type = ompt_cancel_parallel;
65 if (cncl_kind == cancel_parallel)
66 type = ompt_cancel_parallel;
67 else if (cncl_kind == cancel_loop)
68 type = ompt_cancel_loop;
69 else if (cncl_kind == cancel_sections)
70 type = ompt_cancel_sections;
71 ompt_callbacks.ompt_callback(ompt_callback_cancel)(
72 task_data, type | ompt_cancel_activated,
73 OMPT_GET_RETURN_ADDRESS(0));
80 case cancel_taskgroup:
85 kmp_taskgroup_t *taskgroup;
87 task = this_thr->th.th_current_task;
88 KMP_DEBUG_ASSERT(task);
90 taskgroup = task->td_taskgroup;
92 kmp_int32 old = cancel_noreq;
93 taskgroup->cancel_request.compare_exchange_strong(old, cncl_kind);
94 if (old == cancel_noreq || old == cncl_kind) {
97 #if OMPT_SUPPORT && OMPT_OPTIONAL 98 if (ompt_enabled.ompt_callback_cancel) {
99 ompt_data_t *task_data;
100 __ompt_get_task_info_internal(0, NULL, &task_data, NULL, NULL,
102 ompt_callbacks.ompt_callback(ompt_callback_cancel)(
103 task_data, ompt_cancel_taskgroup | ompt_cancel_activated,
104 OMPT_GET_RETURN_ADDRESS(0));
123 KMP_DEBUG_ASSERT(!__kmp_omp_cancellation);
138 kmp_int32 __kmpc_cancellationpoint(
ident_t *loc_ref, kmp_int32 gtid,
139 kmp_int32 cncl_kind) {
140 kmp_info_t *this_thr = __kmp_threads[gtid];
143 (
"__kmpc_cancellationpoint: T#%d request %d OMP_CANCELLATION=%d\n",
144 gtid, cncl_kind, __kmp_omp_cancellation));
146 KMP_DEBUG_ASSERT(cncl_kind != cancel_noreq);
147 KMP_DEBUG_ASSERT(cncl_kind == cancel_parallel || cncl_kind == cancel_loop ||
148 cncl_kind == cancel_sections ||
149 cncl_kind == cancel_taskgroup);
150 KMP_DEBUG_ASSERT(__kmp_get_gtid() == gtid);
152 if (__kmp_omp_cancellation) {
154 case cancel_parallel:
156 case cancel_sections:
160 kmp_team_t *this_team = this_thr->th.th_team;
161 KMP_DEBUG_ASSERT(this_team);
162 if (this_team->t.t_cancel_request) {
163 if (cncl_kind == this_team->t.t_cancel_request) {
166 #if OMPT_SUPPORT && OMPT_OPTIONAL 167 if (ompt_enabled.ompt_callback_cancel) {
168 ompt_data_t *task_data;
169 __ompt_get_task_info_internal(0, NULL, &task_data, NULL, NULL,
171 ompt_cancel_flag_t type = ompt_cancel_parallel;
172 if (cncl_kind == cancel_parallel)
173 type = ompt_cancel_parallel;
174 else if (cncl_kind == cancel_loop)
175 type = ompt_cancel_loop;
176 else if (cncl_kind == cancel_sections)
177 type = ompt_cancel_sections;
178 ompt_callbacks.ompt_callback(ompt_callback_cancel)(
179 task_data, type | ompt_cancel_detected,
180 OMPT_GET_RETURN_ADDRESS(0));
193 case cancel_taskgroup:
197 kmp_taskdata_t *task;
198 kmp_taskgroup_t *taskgroup;
200 task = this_thr->th.th_current_task;
201 KMP_DEBUG_ASSERT(task);
203 taskgroup = task->td_taskgroup;
206 #if OMPT_SUPPORT && OMPT_OPTIONAL 207 if (ompt_enabled.ompt_callback_cancel &&
208 !!taskgroup->cancel_request) {
209 ompt_data_t *task_data;
210 __ompt_get_task_info_internal(0, NULL, &task_data, NULL, NULL,
212 ompt_callbacks.ompt_callback(ompt_callback_cancel)(
213 task_data, ompt_cancel_taskgroup | ompt_cancel_detected,
214 OMPT_GET_RETURN_ADDRESS(0));
217 return !!taskgroup->cancel_request;
230 KMP_DEBUG_ASSERT(!__kmp_omp_cancellation);
246 kmp_int32 __kmpc_cancel_barrier(
ident_t *loc, kmp_int32 gtid) {
248 kmp_info_t *this_thr = __kmp_threads[gtid];
249 kmp_team_t *this_team = this_thr->th.th_team;
251 KMP_DEBUG_ASSERT(__kmp_get_gtid() == gtid);
257 if (__kmp_omp_cancellation) {
260 switch (KMP_ATOMIC_LD_RLX(&(this_team->t.t_cancel_request))) {
261 case cancel_parallel:
266 this_team->t.t_cancel_request = cancel_noreq;
271 case cancel_sections:
276 this_team->t.t_cancel_request = cancel_noreq;
281 case cancel_taskgroup:
312 int __kmp_get_cancellation_status(
int cancel_kind) {
313 if (__kmp_omp_cancellation) {
314 kmp_info_t *this_thr = __kmp_entry_thread();
316 switch (cancel_kind) {
317 case cancel_parallel:
319 case cancel_sections: {
320 kmp_team_t *this_team = this_thr->th.th_team;
321 return this_team->t.t_cancel_request == cancel_kind;
323 case cancel_taskgroup: {
324 kmp_taskdata_t *task;
325 kmp_taskgroup_t *taskgroup;
326 task = this_thr->th.th_current_task;
327 taskgroup = task->td_taskgroup;
328 return taskgroup && taskgroup->cancel_request;
KMP_EXPORT void __kmpc_barrier(ident_t *, kmp_int32 global_tid)