Skip to content

Commit 6d88e04

Browse files
committedDec 13, 2018
[OpenMP] Implement OpenMP 5.0 affinity format functionality
This patch adds the affinity format functionality introduced in OpenMP 5.0. This patch adds: Two new environment variables: OMP_DISPLAY_AFFINITY=TRUE|FALSE OMP_AFFINITY_FORMAT=<string> and Four new API: 1) omp_set_affinity_format() 2) omp_get_affinity_format() 3) omp_display_affinity() 4) omp_capture_affinity() The affinity format functionality has two ICV's associated with it: affinity-display-var (bool) and affinity-format-var (string). The affinity-display-var enables/disables the functionality through the envirable OMP_DISPLAY_AFFINITY. The affinity-format-var is a formatted string with the special field types beginning with a '%' character similar to printf For example, the affinity-format-var could be: "OMP: host:%H pid:%P OStid:%i num_threads:%N thread_num:%n affinity:{%A}" The affinity-format-var is displayed by every thread implicitly at the beginning of a parallel region when any thread's affinity has changed (including a brand new thread being spawned), or explicitly using the omp_display_affinity() API. The omp_capture_affinity() function can capture the affinity-format-var in a char buffer. And omp_set|get_affinity_format() allow the user to set|get the affinity-format-var explicitly at runtime. omp_capture_affinity() and omp_get_affinity_format() both return the number of characters needed to hold the entire string it tried to make (not including NULL character). If not enough buffer space is available, both these functions truncate their output. Differential Revision: https://reviews.llvm.org/D55148 llvm-svn: 349089
1 parent 66c6c5a commit 6d88e04

23 files changed

+1024
-129
lines changed
 

‎openmp/runtime/src/dllexports

+8
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,14 @@ kmp_set_disp_num_buffers 890
547547
omp_get_default_allocator 893
548548
omp_alloc 894
549549
omp_free 895
550+
omp_set_affinity_format 748
551+
omp_get_affinity_format 749
552+
omp_display_affinity 750
553+
omp_capture_affinity 751
554+
ompc_set_affinity_format 752
555+
ompc_get_affinity_format 753
556+
ompc_display_affinity 754
557+
ompc_capture_affinity 755
550558

551559
OMP_NULL_ALLOCATOR DATA
552560
omp_default_mem_alloc DATA

‎openmp/runtime/src/i18n/en_US.txt

+1
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@ AffHWSubsetManyNodes "KMP_HW_SUBSET ignored: too many NUMA Nodes request
425425
AffHWSubsetManyTiles "KMP_HW_SUBSET ignored: too many L2 Caches requested."
426426
AffHWSubsetManyProcs "KMP_HW_SUBSET ignored: too many Procs requested."
427427
HierSchedInvalid "Hierarchy ignored: unsupported level: %1$s."
428+
AffFormatDefault "OMP: pid %1$s tid %2$s thread %3$s bound to OS proc set {%4$s}"
428429

429430

430431
# --------------------------------------------------------------------------------------------------

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

+11
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@
2525
extern "C" {
2626
# endif
2727

28+
# define omp_set_affinity_format ompc_set_affinity_format
29+
# define omp_get_affinity_format ompc_get_affinity_format
30+
# define omp_display_affinity ompc_display_affinity
31+
# define omp_capture_affinity ompc_capture_affinity
32+
2833
# if defined(_WIN32)
2934
# define __KAI_KMPC_CONVENTION __cdecl
3035
# ifndef __KMP_IMP
@@ -235,6 +240,12 @@
235240
extern void __KAI_KMPC_CONVENTION omp_free(void *ptr, const omp_allocator_t *allocator);
236241
#endif
237242

243+
/* OpenMP 5.0 Affinity Format */
244+
extern void __KAI_KMPC_CONVENTION omp_set_affinity_format(char const *);
245+
extern size_t __KAI_KMPC_CONVENTION omp_get_affinity_format(char *, size_t);
246+
extern void __KAI_KMPC_CONVENTION omp_display_affinity(char const *);
247+
extern size_t __KAI_KMPC_CONVENTION omp_capture_affinity(char *, size_t, char const *);
248+
238249
# undef __KAI_KMPC_CONVENTION
239250
# undef __KMP_IMP
240251

‎openmp/runtime/src/include/50/omp_lib.f.var

+37
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,27 @@
375375
integer (kind=omp_allocator_kind) omp_get_default_allocator
376376
end function omp_get_default_allocator
377377

378+
subroutine omp_set_affinity_format(format)
379+
character (len=*) format
380+
end subroutine omp_set_affinity_format
381+
382+
function omp_get_affinity_format(buffer)
383+
use omp_lib_kinds
384+
character (len=*) buffer
385+
integer (kind=kmp_size_t_kind) omp_get_affinity_format
386+
end function omp_get_affinity_format
387+
388+
subroutine omp_display_affinity(format)
389+
character (len=*) format
390+
end subroutine omp_display_affinity
391+
392+
function omp_capture_affinity(buffer, format)
393+
use omp_lib_kinds
394+
character (len=*) format
395+
character (len=*) buffer
396+
integer (kind=kmp_size_t_kind) omp_capture_affinity
397+
end function omp_capture_affinity
398+
378399
! ***
379400
! *** kmp_* entry points
380401
! ***
@@ -594,6 +615,10 @@
594615
!dec$ attributes alias:'OMP_IS_INITIAL_DEVICE' :: omp_is_initial_device
595616
!dec$ attributes alias:'OMP_GET_MAX_TASK_PRIORITY' :: omp_get_max_task_priority
596617
!dec$ attributes alias:'OMP_CONTROL_TOOL' :: omp_control_tool
618+
!dec$ attributes alias:'OMP_SET_AFFINITY_FORMAT' :: omp_set_affinity_format
619+
!dec$ attributes alias:'OMP_GET_AFFINITY_FORMAT' :: omp_get_affinity_format
620+
!dec$ attributes alias:'OMP_DISPLAY_AFFINITY' :: omp_display_affinity
621+
!dec$ attributes alias:'OMP_CAPTURE_AFFINITY' :: omp_capture_affinity
597622

598623
!dec$ attributes alias:'omp_init_lock' :: omp_init_lock
599624
!dec$ attributes alias:'omp_init_lock_with_hint' :: omp_init_lock_with_hint
@@ -675,6 +700,10 @@
675700
!dec$ attributes alias:'_OMP_IS_INITIAL_DEVICE' :: omp_is_initial_device
676701
!dec$ attributes alias:'_OMP_GET_MAX_TASK_PRIORTY' :: omp_get_max_task_priority
677702
!dec$ attributes alias:'_OMP_CONTROL_TOOL' :: omp_control_tool
703+
!dec$ attributes alias:'_OMP_SET_AFFINITY_FORMAT' :: omp_set_affinity_format
704+
!dec$ attributes alias:'_OMP_GET_AFFINITY_FORMAT' :: omp_get_affinity_format
705+
!dec$ attributes alias:'_OMP_DISPLAY_AFFINITY' :: omp_display_affinity
706+
!dec$ attributes alias:'_OMP_CAPTURE_AFFINITY' :: omp_capture_affinity
678707

679708
!dec$ attributes alias:'_omp_init_lock' :: omp_init_lock
680709
!dec$ attributes alias:'_omp_init_lock_with_hint' :: omp_init_lock_with_hint
@@ -758,6 +787,10 @@
758787
!dec$ attributes alias:'omp_get_cancellation_'::omp_get_cancellation
759788
!dec$ attributes alias:'omp_is_initial_device_'::omp_is_initial_device
760789
!dec$ attributes alias:'omp_get_max_task_priority_'::omp_get_max_task_priority
790+
!dec$ attributes alias:'omp_set_affinity_format_' :: omp_set_affinity_format
791+
!dec$ attributes alias:'omp_get_affinity_format_' :: omp_get_affinity_format
792+
!dec$ attributes alias:'omp_display_affinity_' :: omp_display_affinity
793+
!dec$ attributes alias:'omp_capture_affinity_' :: omp_capture_affinity
761794

762795
!dec$ attributes alias:'omp_init_lock_'::omp_init_lock
763796
!dec$ attributes alias:'omp_init_lock_with_hint_'::omp_init_lock_with_hint
@@ -852,6 +885,10 @@
852885
!dec$ attributes alias:'_omp_unset_nest_lock_'::omp_unset_nest_lock
853886
!dec$ attributes alias:'_omp_test_nest_lock_'::omp_test_nest_lock
854887
!dec$ attributes alias:'_omp_control_tool_'::omp_control_tool
888+
!dec$ attributes alias:'_omp_set_affinity_format_' :: omp_set_affinity_format
889+
!dec$ attributes alias:'_omp_get_affinity_format_' :: omp_get_affinity_format
890+
!dec$ attributes alias:'_omp_display_affinity_' :: omp_display_affinity
891+
!dec$ attributes alias:'_omp_capture_affinity_' :: omp_capture_affinity
855892

856893
!dec$ attributes alias:'_kmp_set_stacksize_'::kmp_set_stacksize
857894
!dec$ attributes alias:'_kmp_set_stacksize_s_'::kmp_set_stacksize_s

‎openmp/runtime/src/include/50/omp_lib.f90.var

+21
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,27 @@
391391
integer (kind=omp_allocator_kind) omp_get_default_allocator
392392
end function omp_get_default_allocator
393393

394+
subroutine omp_set_affinity_format(format)
395+
character (len=*) :: format
396+
end subroutine omp_set_affinity_format
397+
398+
function omp_get_affinity_format(buffer)
399+
use omp_lib_kinds
400+
character (len=*) :: buffer
401+
integer (kind=kmp_size_t_kind) :: omp_get_affinity_format
402+
end function omp_get_affinity_format
403+
404+
subroutine omp_display_affinity(format)
405+
character (len=*) :: format
406+
end subroutine omp_display_affinity
407+
408+
function omp_capture_affinity(buffer, format)
409+
use omp_lib_kinds
410+
character (len=*) :: format
411+
character (len=*) :: buffer
412+
integer (kind=kmp_size_t_kind) :: omp_capture_affinity
413+
end function omp_capture_affinity
414+
394415
! ***
395416
! *** kmp_* entry points
396417
! ***

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

+29
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,27 @@
424424
integer (kind=omp_allocator_kind) omp_get_default_allocator
425425
end function omp_get_default_allocator
426426

427+
subroutine omp_set_affinity_format(format)
428+
character (len=*) :: format
429+
end subroutine omp_set_affinity_format
430+
431+
function omp_get_affinity_format(buffer)
432+
import
433+
character (len=*) :: buffer
434+
integer (kind=kmp_size_t_kind) :: omp_get_affinity_format
435+
end function omp_get_affinity_format
436+
437+
subroutine omp_display_affinity(format)
438+
character (len=*) :: format
439+
end subroutine omp_display_affinity
440+
441+
function omp_capture_affinity(buffer, format)
442+
import
443+
character (len=*) :: format
444+
character (len=*) :: buffer
445+
integer (kind=kmp_size_t_kind) :: omp_capture_affinity
446+
end function omp_capture_affinity
447+
427448
! ***
428449
! *** kmp_* entry points
429450
! ***
@@ -637,6 +658,10 @@
637658
!DIR$ ATTRIBUTES OFFLOAD:MIC :: omp_unset_nest_lock
638659
!DIR$ ATTRIBUTES OFFLOAD:MIC :: omp_test_nest_lock
639660
!DIR$ ATTRIBUTES OFFLOAD:MIC :: omp_get_max_task_priority
661+
!DIR$ ATTRIBUTES OFFLOAD:MIC :: omp_set_affinity_format
662+
!DIR$ ATTRIBUTES OFFLOAD:MIC :: omp_get_affinity_format
663+
!DIR$ ATTRIBUTES OFFLOAD:MIC :: omp_display_affinity
664+
!DIR$ ATTRIBUTES OFFLOAD:MIC :: omp_capture_affinity
640665
!DIR$ ATTRIBUTES OFFLOAD:MIC :: kmp_set_stacksize
641666
!DIR$ ATTRIBUTES OFFLOAD:MIC :: kmp_set_stacksize_s
642667
!DIR$ ATTRIBUTES OFFLOAD:MIC :: kmp_set_blocktime
@@ -710,6 +735,10 @@
710735
!$omp declare target(omp_unset_nest_lock )
711736
!$omp declare target(omp_test_nest_lock )
712737
!$omp declare target(omp_get_max_task_priority )
738+
!$omp declare target(omp_set_affinity_format )
739+
!$omp declare target(omp_get_affinity_format )
740+
!$omp declare target(omp_display_affinity )
741+
!$omp declare target(omp_capture_affinity )
713742
!$omp declare target(kmp_set_stacksize )
714743
!$omp declare target(kmp_set_stacksize_s )
715744
!$omp declare target(kmp_set_blocktime )

‎openmp/runtime/src/kmp.h

+30
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,11 @@ class kmp_stats_list;
129129
#include "ompt-internal.h"
130130
#endif
131131

132+
#if OMP_50_ENABLED
133+
// Affinity format function
134+
#include "kmp_str.h"
135+
#endif
136+
132137
// 0 - no fast memory allocation, alignment: 8-byte on x86, 16-byte on x64.
133138
// 3 - fast allocation using sync, non-sync free lists of any size, non-self
134139
// free lists of limited size.
@@ -797,6 +802,12 @@ extern kmp_nested_proc_bind_t __kmp_nested_proc_bind;
797802

798803
#endif /* OMP_40_ENABLED */
799804

805+
#if OMP_50_ENABLED
806+
extern int __kmp_display_affinity;
807+
extern char *__kmp_affinity_format;
808+
static const size_t KMP_AFFINITY_FORMAT_SIZE = 512;
809+
#endif // OMP_50_ENABLED
810+
800811
#if KMP_AFFINITY_SUPPORTED
801812
#define KMP_PLACE_ALL (-1)
802813
#define KMP_PLACE_UNDEFINED (-2)
@@ -2507,6 +2518,10 @@ typedef struct KMP_ALIGN_CACHE kmp_base_info {
25072518
int th_last_place; /* last place in partition */
25082519
#endif
25092520
#endif
2521+
#if OMP_50_ENABLED
2522+
int th_prev_level; /* previous level for affinity format */
2523+
int th_prev_num_threads; /* previous num_threads for affinity format */
2524+
#endif
25102525
#if USE_ITT_BUILD
25112526
kmp_uint64 th_bar_arrive_time; /* arrival to barrier timestamp */
25122527
kmp_uint64 th_bar_min_time; /* minimum arrival time at the barrier */
@@ -2700,6 +2715,9 @@ typedef struct KMP_ALIGN_CACHE kmp_base_team {
27002715
int t_first_place; // first & last place in parent thread's partition.
27012716
int t_last_place; // Restore these values to master after par region.
27022717
#endif // OMP_40_ENABLED && KMP_AFFINITY_SUPPORTED
2718+
#if OMP_50_ENABLED
2719+
int t_display_affinity;
2720+
#endif
27032721
int t_size_changed; // team size was changed?: 0: no, 1: yes, -1: changed via
27042722
// omp_set_num_threads() call
27052723
#if OMP_50_ENABLED
@@ -3383,6 +3401,8 @@ extern void __kmp_runtime_destroy(void);
33833401
#if KMP_AFFINITY_SUPPORTED
33843402
extern char *__kmp_affinity_print_mask(char *buf, int buf_len,
33853403
kmp_affin_mask_t *mask);
3404+
extern kmp_str_buf_t *__kmp_affinity_str_buf_mask(kmp_str_buf_t *buf,
3405+
kmp_affin_mask_t *mask);
33863406
extern void __kmp_affinity_initialize(void);
33873407
extern void __kmp_affinity_uninitialize(void);
33883408
extern void __kmp_affinity_set_init_mask(
@@ -3402,6 +3422,14 @@ extern void __kmp_balanced_affinity(kmp_info_t *th, int team_size);
34023422
extern int kmp_set_thread_affinity_mask_initial(void);
34033423
#endif
34043424
#endif /* KMP_AFFINITY_SUPPORTED */
3425+
#if OMP_50_ENABLED
3426+
// No need for KMP_AFFINITY_SUPPORTED guard as only one field in the
3427+
// format string is for affinity, so platforms that do not support
3428+
// affinity can still use the other fields, e.g., %n for num_threads
3429+
extern size_t __kmp_aux_capture_affinity(int gtid, const char *format,
3430+
kmp_str_buf_t *buffer);
3431+
extern void __kmp_aux_display_affinity(int gtid, const char *format);
3432+
#endif
34053433

34063434
extern void __kmp_cleanup_hierarchy();
34073435
extern void __kmp_get_hierarchy(kmp_uint32 nproc, kmp_bstate_t *thr_bar);
@@ -3554,6 +3582,8 @@ KMP_EXPORT int __kmpc_invoke_task_func(int gtid);
35543582
#if OMP_40_ENABLED
35553583
extern int __kmp_invoke_teams_master(int gtid);
35563584
extern void __kmp_teams_master(int gtid);
3585+
extern int __kmp_aux_get_team_num();
3586+
extern int __kmp_aux_get_num_teams();
35573587
#endif
35583588
extern void __kmp_save_internal_controls(kmp_info_t *thread);
35593589
extern void __kmp_user_set_library(enum library_type arg);

0 commit comments

Comments
 (0)