16 #include "ompt-specific.cpp" 22 #define ompt_get_callback_success 1 23 #define ompt_get_callback_failure 0 25 #define no_tool_present 0 27 #define OMPT_API_ROUTINE static 29 #ifndef OMPT_STR_MATCH 30 #define OMPT_STR_MATCH(haystack, needle) (!strcasecmp(haystack, needle)) 38 const char *state_name;
39 ompt_state_t state_id;
49 typedef void (*ompt_initialize_t)(ompt_function_lookup_t ompt_fn_lookup,
51 unsigned int ompt_version);
59 ompt_state_info_t ompt_state_info[] = {
60 #define ompt_state_macro(state, code) {#state, state}, 61 FOREACH_OMPT_STATE(ompt_state_macro)
62 #undef ompt_state_macro 65 ompt_callbacks_t ompt_callbacks;
67 static ompt_initialize_t ompt_initialize_fn = NULL;
73 static ompt_interface_fn_t ompt_fn_lookup(
const char *s);
75 OMPT_API_ROUTINE ompt_thread_id_t ompt_get_thread_id(
void);
89 #if OMPT_HAVE_WEAK_ATTRIBUTE 91 __attribute__((weak)) ompt_initialize_t ompt_tool() {
93 printf(
"ompt_tool() is called from the RTL\n");
101 #pragma comment(lib, "psapi.lib") 102 #define ompt_tool ompt_tool_windows 105 #define NUM_MODULES 128 107 static ompt_initialize_t ompt_tool_windows() {
109 DWORD needed, new_size;
111 HANDLE process = GetCurrentProcess();
112 modules = (HMODULE *)malloc(NUM_MODULES *
sizeof(HMODULE));
113 ompt_initialize_t (*ompt_tool_p)() = NULL;
116 printf(
"ompt_tool_windows(): looking for ompt_tool\n");
118 if (!EnumProcessModules(process, modules, NUM_MODULES *
sizeof(HMODULE),
125 new_size = needed /
sizeof(HMODULE);
126 if (new_size > NUM_MODULES) {
128 printf(
"ompt_tool_windows(): resize buffer to %d bytes\n", needed);
130 modules = (HMODULE *)realloc(modules, needed);
132 if (!EnumProcessModules(process, modules, needed, &needed)) {
137 for (i = 0; i < new_size; ++i) {
138 (FARPROC &)ompt_tool_p = GetProcAddress(modules[i],
"ompt_tool");
141 TCHAR modName[MAX_PATH];
142 if (GetModuleFileName(modules[i], modName, MAX_PATH))
143 printf(
"ompt_tool_windows(): ompt_tool found in module %s\n", modName);
146 return ompt_tool_p();
150 TCHAR modName[MAX_PATH];
151 if (GetModuleFileName(modules[i], modName, MAX_PATH))
152 printf(
"ompt_tool_windows(): ompt_tool not found in module %s\n",
161 #error Either __attribute__((weak)) or psapi.dll are required for OMPT support 162 #endif // OMPT_HAVE_WEAK_ATTRIBUTE 164 void ompt_pre_init() {
168 static int ompt_pre_initialized = 0;
170 if (ompt_pre_initialized)
173 ompt_pre_initialized = 1;
178 const char *ompt_env_var = getenv(
"OMP_TOOL");
179 tool_setting_e tool_setting = omp_tool_error;
181 if (!ompt_env_var || !strcmp(ompt_env_var,
""))
182 tool_setting = omp_tool_unset;
183 else if (OMPT_STR_MATCH(ompt_env_var,
"disabled"))
184 tool_setting = omp_tool_disabled;
185 else if (OMPT_STR_MATCH(ompt_env_var,
"enabled"))
186 tool_setting = omp_tool_enabled;
189 printf(
"ompt_pre_init(): tool_setting = %d\n", tool_setting);
191 switch (tool_setting) {
192 case omp_tool_disabled:
196 case omp_tool_enabled:
197 ompt_initialize_fn = ompt_tool();
198 if (ompt_initialize_fn) {
204 fprintf(stderr,
"Warning: OMP_TOOL has invalid value \"%s\".\n" 205 " legal values are (NULL,\"\",\"disabled\"," 211 printf(
"ompt_pre_init(): ompt_enabled = %d\n", ompt_enabled);
215 void ompt_post_init() {
219 static int ompt_post_initialized = 0;
221 if (ompt_post_initialized)
224 ompt_post_initialized = 1;
230 ompt_initialize_fn(ompt_fn_lookup, ompt_get_runtime_version(),
233 ompt_thread_t *root_thread = ompt_get_thread();
235 ompt_set_thread_state(root_thread, ompt_state_overhead);
237 if (ompt_callbacks.ompt_callback(ompt_event_thread_begin)) {
238 ompt_callbacks.ompt_callback(ompt_event_thread_begin)(
239 ompt_thread_initial, ompt_get_thread_id());
242 ompt_set_thread_state(root_thread, ompt_state_work_serial);
248 if (ompt_callbacks.ompt_callback(ompt_event_runtime_shutdown)) {
249 ompt_callbacks.ompt_callback(ompt_event_runtime_shutdown)();
264 OMPT_API_ROUTINE
int ompt_enumerate_state(
int current_state,
int *next_state,
265 const char **next_state_name) {
266 const static int len =
sizeof(ompt_state_info) /
sizeof(ompt_state_info_t);
269 for (i = 0; i < len - 1; i++) {
270 if (ompt_state_info[i].state_id == current_state) {
271 *next_state = ompt_state_info[i + 1].state_id;
272 *next_state_name = ompt_state_info[i + 1].state_name;
284 OMPT_API_ROUTINE
int ompt_set_callback(ompt_event_t evid, ompt_callback_t cb) {
287 #define ompt_event_macro(event_name, callback_type, event_id) \ 289 if (ompt_event_implementation_status(event_name)) { \ 290 ompt_callbacks.ompt_callback(event_name) = (callback_type)cb; \ 292 return ompt_event_implementation_status(event_name); 294 FOREACH_OMPT_EVENT(ompt_event_macro)
296 #undef ompt_event_macro 299 return ompt_set_result_registration_error;
303 OMPT_API_ROUTINE
int ompt_get_callback(ompt_event_t evid, ompt_callback_t *cb) {
306 #define ompt_event_macro(event_name, callback_type, event_id) \ 308 if (ompt_event_implementation_status(event_name)) { \ 309 ompt_callback_t mycb = \ 310 (ompt_callback_t)ompt_callbacks.ompt_callback(event_name); \ 313 return ompt_get_callback_success; \ 316 return ompt_get_callback_failure; 318 FOREACH_OMPT_EVENT(ompt_event_macro)
320 #undef ompt_event_macro 323 return ompt_get_callback_failure;
331 OMPT_API_ROUTINE ompt_parallel_id_t ompt_get_parallel_id(
int ancestor_level) {
332 return __ompt_get_parallel_id_internal(ancestor_level);
335 OMPT_API_ROUTINE
int ompt_get_parallel_team_size(
int ancestor_level) {
336 return __ompt_get_parallel_team_size_internal(ancestor_level);
339 OMPT_API_ROUTINE
void *ompt_get_parallel_function(
int ancestor_level) {
340 return __ompt_get_parallel_function_internal(ancestor_level);
343 OMPT_API_ROUTINE ompt_state_t ompt_get_state(ompt_wait_id_t *ompt_wait_id) {
344 ompt_state_t thread_state = __ompt_get_state_internal(ompt_wait_id);
346 if (thread_state == ompt_state_undefined) {
347 thread_state = ompt_state_work_serial;
357 OMPT_API_ROUTINE
void *ompt_get_idle_frame() {
358 return __ompt_get_idle_frame_internal();
365 OMPT_API_ROUTINE ompt_thread_id_t ompt_get_thread_id(
void) {
366 return __ompt_get_thread_id_internal();
369 OMPT_API_ROUTINE ompt_task_id_t ompt_get_task_id(
int depth) {
370 return __ompt_get_task_id_internal(depth);
373 OMPT_API_ROUTINE ompt_frame_t *ompt_get_task_frame(
int depth) {
374 return __ompt_get_task_frame_internal(depth);
377 OMPT_API_ROUTINE
void *ompt_get_task_function(
int depth) {
378 return __ompt_get_task_function_internal(depth);
387 #define OMPT_API_PLACEHOLDER 394 OMPT_API_PLACEHOLDER
void ompt_idle(
void) {
400 OMPT_API_PLACEHOLDER
void ompt_overhead(
void) {
406 OMPT_API_PLACEHOLDER
void ompt_barrier_wait(
void) {
413 OMPT_API_PLACEHOLDER
void ompt_task_wait(
void) {
420 OMPT_API_PLACEHOLDER
void ompt_mutex_wait(
void) {
435 OMPT_API_ROUTINE
int ompt_get_ompt_version() {
return OMPT_VERSION; }
445 _OMP_EXTERN
void ompt_control(uint64_t command, uint64_t modifier) {
446 if (ompt_enabled && ompt_callbacks.ompt_callback(ompt_event_control)) {
447 ompt_callbacks.ompt_callback(ompt_event_control)(command, modifier);
455 static ompt_interface_fn_t ompt_fn_lookup(
const char *s) {
457 #define ompt_interface_fn(fn) \ 458 if (strcmp(s, #fn) == 0) \ 459 return (ompt_interface_fn_t)fn; 461 FOREACH_OMPT_INQUIRY_FN(ompt_interface_fn)
463 FOREACH_OMPT_PLACEHOLDER_FN(ompt_interface_fn)
465 return (ompt_interface_fn_t)0;