1d2a6e165SVignesh Balasubramanianfrom __future__ import print_function 2d2a6e165SVignesh Balasubramanianimport ompdModule 3d2a6e165SVignesh Balasubramanianfrom ompd_handles import ompd_thread, ompd_task, ompd_parallel 4d2a6e165SVignesh Balasubramanianimport gdb 5d2a6e165SVignesh Balasubramanianimport sys 6d2a6e165SVignesh Balasubramanianimport traceback 7d2a6e165SVignesh Balasubramanianfrom enum import Enum 8d2a6e165SVignesh Balasubramanian 9*f98ee40fSTobias Hieta 10d2a6e165SVignesh Balasubramanianclass ompd_scope(Enum): 11d2a6e165SVignesh Balasubramanian ompd_scope_global = 1 12d2a6e165SVignesh Balasubramanian ompd_scope_address_space = 2 13d2a6e165SVignesh Balasubramanian ompd_scope_thread = 3 14d2a6e165SVignesh Balasubramanian ompd_scope_parallel = 4 15d2a6e165SVignesh Balasubramanian ompd_scope_implicit_task = 5 16d2a6e165SVignesh Balasubramanian ompd_scope_task = 6 17d2a6e165SVignesh Balasubramanian 18d2a6e165SVignesh Balasubramanian 19*f98ee40fSTobias Hietaclass ompd_address_space(object): 20d2a6e165SVignesh Balasubramanian def __init__(self): 21d2a6e165SVignesh Balasubramanian """Initializes an ompd_address_space object by calling ompd_initialize 22d2a6e165SVignesh Balasubramanian in ompdModule.c 23d2a6e165SVignesh Balasubramanian """ 24d2a6e165SVignesh Balasubramanian self.addr_space = ompdModule.call_ompd_initialize() 25d2a6e165SVignesh Balasubramanian # maps thread_num (thread id given by gdb) to ompd_thread object with thread handle 26d2a6e165SVignesh Balasubramanian self.threads = {} 27d2a6e165SVignesh Balasubramanian self.states = None 28d2a6e165SVignesh Balasubramanian self.icv_map = None 29d2a6e165SVignesh Balasubramanian self.ompd_tool_test_bp = None 30*f98ee40fSTobias Hieta self.scope_map = { 31*f98ee40fSTobias Hieta 1: "global", 32*f98ee40fSTobias Hieta 2: "address_space", 33*f98ee40fSTobias Hieta 3: "thread", 34*f98ee40fSTobias Hieta 4: "parallel", 35*f98ee40fSTobias Hieta 5: "implicit_task", 36*f98ee40fSTobias Hieta 6: "task", 37*f98ee40fSTobias Hieta } 38*f98ee40fSTobias Hieta self.sched_map = {1: "static", 2: "dynamic", 3: "guided", 4: "auto"} 39d2a6e165SVignesh Balasubramanian gdb.events.stop.connect(self.handle_stop_event) 40*f98ee40fSTobias Hieta self.new_thread_breakpoint = gdb.Breakpoint( 41*f98ee40fSTobias Hieta "ompd_bp_thread_begin", internal=True 42*f98ee40fSTobias Hieta ) 43d2a6e165SVignesh Balasubramanian tool_break_symbol = gdb.lookup_global_symbol("ompd_tool_break") 44*f98ee40fSTobias Hieta if tool_break_symbol is not None: 45d2a6e165SVignesh Balasubramanian self.ompd_tool_test_bp = gdb.Breakpoint("ompd_tool_break", internal=True) 46d2a6e165SVignesh Balasubramanian 47d2a6e165SVignesh Balasubramanian def handle_stop_event(self, event): 48d2a6e165SVignesh Balasubramanian """Sets a breakpoint at different events, e.g. when a new OpenMP 49d2a6e165SVignesh Balasubramanian thread is created. 50d2a6e165SVignesh Balasubramanian """ 51*f98ee40fSTobias Hieta if isinstance(event, gdb.BreakpointEvent): 52d2a6e165SVignesh Balasubramanian # check if breakpoint has already been hit 53*f98ee40fSTobias Hieta if self.new_thread_breakpoint in event.breakpoints: 54d2a6e165SVignesh Balasubramanian self.add_thread() 55*f98ee40fSTobias Hieta gdb.execute("continue") 56d2a6e165SVignesh Balasubramanian return 57*f98ee40fSTobias Hieta elif ( 58*f98ee40fSTobias Hieta self.ompd_tool_test_bp is not None 59*f98ee40fSTobias Hieta and self.ompd_tool_test_bp in event.breakpoints 60*f98ee40fSTobias Hieta ): 61d2a6e165SVignesh Balasubramanian try: 62d2a6e165SVignesh Balasubramanian self.compare_ompt_data() 63*f98ee40fSTobias Hieta gdb.execute("continue") 64d2a6e165SVignesh Balasubramanian except (): 65d2a6e165SVignesh Balasubramanian traceback.print_exc() 66*f98ee40fSTobias Hieta elif isinstance(event, gdb.SignalEvent): 67d2a6e165SVignesh Balasubramanian # TODO: what do we need to do on SIGNALS? 68d2a6e165SVignesh Balasubramanian pass 69d2a6e165SVignesh Balasubramanian else: 70d2a6e165SVignesh Balasubramanian # TODO: probably not possible? 71d2a6e165SVignesh Balasubramanian pass 72d2a6e165SVignesh Balasubramanian 73d2a6e165SVignesh Balasubramanian def get_icv_map(self): 74*f98ee40fSTobias Hieta """Fills ICV map.""" 75d2a6e165SVignesh Balasubramanian self.icv_map = {} 76d2a6e165SVignesh Balasubramanian current = 0 77d2a6e165SVignesh Balasubramanian more = 1 78d2a6e165SVignesh Balasubramanian while more > 0: 79d2a6e165SVignesh Balasubramanian tup = ompdModule.call_ompd_enumerate_icvs(self.addr_space, current) 80d2a6e165SVignesh Balasubramanian (current, next_icv, next_scope, more) = tup 81d2a6e165SVignesh Balasubramanian self.icv_map[next_icv] = (current, next_scope, self.scope_map[next_scope]) 82*f98ee40fSTobias Hieta print("Initialized ICV map successfully for checking OMP API values.") 83d2a6e165SVignesh Balasubramanian 84d2a6e165SVignesh Balasubramanian def compare_ompt_data(self): 85*f98ee40fSTobias Hieta """Compares OMPT tool data about parallel region to data returned by OMPD functions.""" 86d2a6e165SVignesh Balasubramanian # make sure all threads and states are set 87d2a6e165SVignesh Balasubramanian self.list_threads(False) 88d2a6e165SVignesh Balasubramanian 89d2a6e165SVignesh Balasubramanian thread_id = gdb.selected_thread().ptid[1] 90d2a6e165SVignesh Balasubramanian curr_thread = self.get_curr_thread() 91d2a6e165SVignesh Balasubramanian 92d2a6e165SVignesh Balasubramanian # check if current thread is LWP thread; return if "ompd_rc_unavailable" 93d2a6e165SVignesh Balasubramanian thread_handle = ompdModule.get_thread_handle(thread_id, self.addr_space) 94d2a6e165SVignesh Balasubramanian if thread_handle == -1: 95d2a6e165SVignesh Balasubramanian print("Skipping OMPT-OMPD checks for non-LWP thread.") 96d2a6e165SVignesh Balasubramanian return 97d2a6e165SVignesh Balasubramanian 98*f98ee40fSTobias Hieta print("Comparing OMPT data to OMPD data...") 99*f98ee40fSTobias Hieta field_names = [i.name for i in gdb.parse_and_eval("thread_data").type.fields()] 100*f98ee40fSTobias Hieta thread_data = gdb.parse_and_eval("thread_data") 101d2a6e165SVignesh Balasubramanian 102d2a6e165SVignesh Balasubramanian if self.icv_map is None: 103d2a6e165SVignesh Balasubramanian self.get_icv_map() 104d2a6e165SVignesh Balasubramanian 105d2a6e165SVignesh Balasubramanian # compare state values 106*f98ee40fSTobias Hieta if "ompt_state" in field_names: 107d2a6e165SVignesh Balasubramanian if self.states is None: 108d2a6e165SVignesh Balasubramanian self.enumerate_states() 109*f98ee40fSTobias Hieta ompt_state = str(thread_data["ompt_state"]) 110d2a6e165SVignesh Balasubramanian ompd_state = str(self.states[curr_thread.get_state()[0]]) 111d2a6e165SVignesh Balasubramanian if ompt_state != ompd_state: 112*f98ee40fSTobias Hieta print( 113*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: ompt_state (%s) does not match OMPD state (%s)!" 114*f98ee40fSTobias Hieta % (ompt_state, ompd_state) 115*f98ee40fSTobias Hieta ) 116d2a6e165SVignesh Balasubramanian 117d2a6e165SVignesh Balasubramanian # compare wait_id values 118*f98ee40fSTobias Hieta if "ompt_wait_id" in field_names: 119*f98ee40fSTobias Hieta ompt_wait_id = thread_data["ompt_wait_id"] 120d2a6e165SVignesh Balasubramanian ompd_wait_id = curr_thread.get_state()[1] 121d2a6e165SVignesh Balasubramanian if ompt_wait_id != ompd_wait_id: 122*f98ee40fSTobias Hieta print( 123*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: ompt_wait_id (%d) does not match OMPD wait id (%d)!" 124*f98ee40fSTobias Hieta % (ompt_wait_id, ompd_wait_id) 125*f98ee40fSTobias Hieta ) 126d2a6e165SVignesh Balasubramanian 127d2a6e165SVignesh Balasubramanian # compare thread id 128*f98ee40fSTobias Hieta if "omp_thread_num" in field_names and "thread-num-var" in self.icv_map: 129*f98ee40fSTobias Hieta ompt_thread_num = thread_data["omp_thread_num"] 130*f98ee40fSTobias Hieta icv_value = ompdModule.call_ompd_get_icv_from_scope( 131*f98ee40fSTobias Hieta curr_thread.thread_handle, 132*f98ee40fSTobias Hieta self.icv_map["thread-num-var"][1], 133*f98ee40fSTobias Hieta self.icv_map["thread-num-var"][0], 134*f98ee40fSTobias Hieta ) 135d2a6e165SVignesh Balasubramanian if ompt_thread_num != icv_value: 136*f98ee40fSTobias Hieta print( 137*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: omp_thread_num (%d) does not match OMPD thread num according to ICVs (%d)!" 138*f98ee40fSTobias Hieta % (ompt_thread_num, icv_value) 139*f98ee40fSTobias Hieta ) 140d2a6e165SVignesh Balasubramanian 141d2a6e165SVignesh Balasubramanian # compare thread data 142*f98ee40fSTobias Hieta if "ompt_thread_data" in field_names: 143*f98ee40fSTobias Hieta ompt_thread_data = thread_data["ompt_thread_data"].dereference()["value"] 144*f98ee40fSTobias Hieta ompd_value = ompdModule.call_ompd_get_tool_data( 145*f98ee40fSTobias Hieta 3, curr_thread.thread_handle 146*f98ee40fSTobias Hieta )[0] 147d2a6e165SVignesh Balasubramanian if ompt_thread_data != ompd_value: 148*f98ee40fSTobias Hieta print( 149*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: value of ompt_thread_data (%d) does not match that of OMPD data union (%d)!" 150*f98ee40fSTobias Hieta % (ompt_thread_data, ompd_value) 151*f98ee40fSTobias Hieta ) 152d2a6e165SVignesh Balasubramanian 153d2a6e165SVignesh Balasubramanian # compare number of threads 154*f98ee40fSTobias Hieta if "omp_num_threads" in field_names and "team-size-var" in self.icv_map: 155*f98ee40fSTobias Hieta ompt_num_threads = thread_data["omp_num_threads"] 156*f98ee40fSTobias Hieta icv_value = ompdModule.call_ompd_get_icv_from_scope( 157*f98ee40fSTobias Hieta curr_thread.get_current_parallel_handle(), 158*f98ee40fSTobias Hieta self.icv_map["team-size-var"][1], 159*f98ee40fSTobias Hieta self.icv_map["team-size-var"][0], 160*f98ee40fSTobias Hieta ) 161d2a6e165SVignesh Balasubramanian if ompt_num_threads != icv_value: 162*f98ee40fSTobias Hieta print( 163*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: omp_num_threads (%d) does not match OMPD num threads according to ICVs (%d)!" 164*f98ee40fSTobias Hieta % (ompt_num_threads, icv_value) 165*f98ee40fSTobias Hieta ) 166d2a6e165SVignesh Balasubramanian 167d2a6e165SVignesh Balasubramanian # compare omp level 168*f98ee40fSTobias Hieta if "omp_level" in field_names and "levels-var" in self.icv_map: 169*f98ee40fSTobias Hieta ompt_levels = thread_data["omp_level"] 170*f98ee40fSTobias Hieta icv_value = ompdModule.call_ompd_get_icv_from_scope( 171*f98ee40fSTobias Hieta curr_thread.get_current_parallel_handle(), 172*f98ee40fSTobias Hieta self.icv_map["levels-var"][1], 173*f98ee40fSTobias Hieta self.icv_map["levels-var"][0], 174*f98ee40fSTobias Hieta ) 175d2a6e165SVignesh Balasubramanian if ompt_levels != icv_value: 176*f98ee40fSTobias Hieta print( 177*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: omp_level (%d) does not match OMPD levels according to ICVs (%d)!" 178*f98ee40fSTobias Hieta % (ompt_levels, icv_value) 179*f98ee40fSTobias Hieta ) 180d2a6e165SVignesh Balasubramanian 181d2a6e165SVignesh Balasubramanian # compare active level 182*f98ee40fSTobias Hieta if "omp_active_level" in field_names and "active-levels-var" in self.icv_map: 183*f98ee40fSTobias Hieta ompt_active_levels = thread_data["omp_active_level"] 184*f98ee40fSTobias Hieta icv_value = ompdModule.call_ompd_get_icv_from_scope( 185*f98ee40fSTobias Hieta curr_thread.get_current_parallel_handle(), 186*f98ee40fSTobias Hieta self.icv_map["active-levels-var"][1], 187*f98ee40fSTobias Hieta self.icv_map["active-levels-var"][0], 188*f98ee40fSTobias Hieta ) 189d2a6e165SVignesh Balasubramanian if ompt_active_levels != icv_value: 190*f98ee40fSTobias Hieta print( 191*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: active levels (%d) do not match active levels according to ICVs (%d)!" 192*f98ee40fSTobias Hieta % (ompt_active_levels, icv_value) 193*f98ee40fSTobias Hieta ) 194d2a6e165SVignesh Balasubramanian 195d2a6e165SVignesh Balasubramanian # compare parallel data 196*f98ee40fSTobias Hieta if "ompt_parallel_data" in field_names: 197*f98ee40fSTobias Hieta ompt_parallel_data = thread_data["ompt_parallel_data"].dereference()[ 198*f98ee40fSTobias Hieta "value" 199*f98ee40fSTobias Hieta ] 200d2a6e165SVignesh Balasubramanian current_parallel_handle = curr_thread.get_current_parallel_handle() 201*f98ee40fSTobias Hieta ompd_value = ompdModule.call_ompd_get_tool_data(4, current_parallel_handle)[ 202*f98ee40fSTobias Hieta 0 203*f98ee40fSTobias Hieta ] 204d2a6e165SVignesh Balasubramanian if ompt_parallel_data != ompd_value: 205*f98ee40fSTobias Hieta print( 206*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: value of ompt_parallel_data (%d) does not match that of OMPD data union (%d)!" 207*f98ee40fSTobias Hieta % (ompt_parallel_data, ompd_value) 208*f98ee40fSTobias Hieta ) 209d2a6e165SVignesh Balasubramanian 210d2a6e165SVignesh Balasubramanian # compare max threads 211*f98ee40fSTobias Hieta if "omp_max_threads" in field_names and "nthreads-var" in self.icv_map: 212*f98ee40fSTobias Hieta ompt_max_threads = thread_data["omp_max_threads"] 213*f98ee40fSTobias Hieta icv_value = ompdModule.call_ompd_get_icv_from_scope( 214*f98ee40fSTobias Hieta curr_thread.thread_handle, 215*f98ee40fSTobias Hieta self.icv_map["nthreads-var"][1], 216*f98ee40fSTobias Hieta self.icv_map["nthreads-var"][0], 217*f98ee40fSTobias Hieta ) 218d2a6e165SVignesh Balasubramanian if icv_value is None: 219*f98ee40fSTobias Hieta icv_string = ompdModule.call_ompd_get_icv_string_from_scope( 220*f98ee40fSTobias Hieta curr_thread.thread_handle, 221*f98ee40fSTobias Hieta self.icv_map["nthreads-var"][1], 222*f98ee40fSTobias Hieta self.icv_map["nthreads-var"][0], 223*f98ee40fSTobias Hieta ) 224d2a6e165SVignesh Balasubramanian if icv_string is None: 225*f98ee40fSTobias Hieta print( 226*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: omp_max_threads (%d) does not match OMPD thread limit according to ICVs (None Object)" 227*f98ee40fSTobias Hieta % (ompt_max_threads) 228*f98ee40fSTobias Hieta ) 229d2a6e165SVignesh Balasubramanian else: 230*f98ee40fSTobias Hieta if ompt_max_threads != int(icv_string.split(",")[0]): 231*f98ee40fSTobias Hieta print( 232*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: omp_max_threads (%d) does not match OMPD thread limit according to ICVs (%d)!" 233*f98ee40fSTobias Hieta % (ompt_max_threads, int(icv_string.split(",")[0])) 234*f98ee40fSTobias Hieta ) 235d2a6e165SVignesh Balasubramanian else: 236d2a6e165SVignesh Balasubramanian if ompt_max_threads != icv_value: 237*f98ee40fSTobias Hieta print( 238*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: omp_max_threads (%d) does not match OMPD thread limit according to ICVs (%d)!" 239*f98ee40fSTobias Hieta % (ompt_max_threads, icv_value) 240*f98ee40fSTobias Hieta ) 241d2a6e165SVignesh Balasubramanian 242d2a6e165SVignesh Balasubramanian # compare omp_parallel 243d2a6e165SVignesh Balasubramanian # NOTE: omp_parallel = true if active-levels-var > 0 244*f98ee40fSTobias Hieta if "omp_parallel" in field_names: 245*f98ee40fSTobias Hieta ompt_parallel = thread_data["omp_parallel"] 246*f98ee40fSTobias Hieta icv_value = ompdModule.call_ompd_get_icv_from_scope( 247*f98ee40fSTobias Hieta curr_thread.get_current_parallel_handle(), 248*f98ee40fSTobias Hieta self.icv_map["active-levels-var"][1], 249*f98ee40fSTobias Hieta self.icv_map["active-levels-var"][0], 250*f98ee40fSTobias Hieta ) 251*f98ee40fSTobias Hieta if ( 252*f98ee40fSTobias Hieta ompt_parallel == 1 253*f98ee40fSTobias Hieta and icv_value <= 0 254*f98ee40fSTobias Hieta or ompt_parallel == 0 255*f98ee40fSTobias Hieta and icv_value > 0 256*f98ee40fSTobias Hieta ): 257*f98ee40fSTobias Hieta print( 258*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: ompt_parallel (%d) does not match OMPD parallel according to ICVs (%d)!" 259*f98ee40fSTobias Hieta % (ompt_parallel, icv_value) 260*f98ee40fSTobias Hieta ) 261d2a6e165SVignesh Balasubramanian 262d2a6e165SVignesh Balasubramanian # compare omp_final 263*f98ee40fSTobias Hieta if "omp_final" in field_names and "final-task-var" in self.icv_map: 264*f98ee40fSTobias Hieta ompt_final = thread_data["omp_final"] 265d2a6e165SVignesh Balasubramanian current_task_handle = curr_thread.get_current_task_handle() 266*f98ee40fSTobias Hieta icv_value = ompdModule.call_ompd_get_icv_from_scope( 267*f98ee40fSTobias Hieta current_task_handle, 268*f98ee40fSTobias Hieta self.icv_map["final-task-var"][1], 269*f98ee40fSTobias Hieta self.icv_map["final-task-var"][0], 270*f98ee40fSTobias Hieta ) 271d2a6e165SVignesh Balasubramanian if icv_value != ompt_final: 272*f98ee40fSTobias Hieta print( 273*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: omp_final (%d) does not match OMPD final according to ICVs (%d)!" 274*f98ee40fSTobias Hieta % (ompt_final, icv_value) 275*f98ee40fSTobias Hieta ) 276d2a6e165SVignesh Balasubramanian 277d2a6e165SVignesh Balasubramanian # compare omp_dynamic 278*f98ee40fSTobias Hieta if "omp_dynamic" in field_names and "dyn-var" in self.icv_map: 279*f98ee40fSTobias Hieta ompt_dynamic = thread_data["omp_dynamic"] 280*f98ee40fSTobias Hieta icv_value = ompdModule.call_ompd_get_icv_from_scope( 281*f98ee40fSTobias Hieta curr_thread.thread_handle, 282*f98ee40fSTobias Hieta self.icv_map["dyn-var"][1], 283*f98ee40fSTobias Hieta self.icv_map["dyn-var"][0], 284*f98ee40fSTobias Hieta ) 285d2a6e165SVignesh Balasubramanian if icv_value != ompt_dynamic: 286*f98ee40fSTobias Hieta print( 287*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: omp_dynamic (%d) does not match OMPD dynamic according to ICVs (%d)!" 288*f98ee40fSTobias Hieta % (ompt_dynamic, icv_value) 289*f98ee40fSTobias Hieta ) 290d2a6e165SVignesh Balasubramanian 291d2a6e165SVignesh Balasubramanian # compare omp_max_active_levels 292*f98ee40fSTobias Hieta if ( 293*f98ee40fSTobias Hieta "omp_max_active_levels" in field_names 294*f98ee40fSTobias Hieta and "max-active-levels-var" in self.icv_map 295*f98ee40fSTobias Hieta ): 296*f98ee40fSTobias Hieta ompt_max_active_levels = thread_data["omp_max_active_levels"] 297*f98ee40fSTobias Hieta icv_value = ompdModule.call_ompd_get_icv_from_scope( 298*f98ee40fSTobias Hieta curr_thread.get_current_task_handle(), 299*f98ee40fSTobias Hieta self.icv_map["max-active-levels-var"][1], 300*f98ee40fSTobias Hieta self.icv_map["max-active-levels-var"][0], 301*f98ee40fSTobias Hieta ) 302d2a6e165SVignesh Balasubramanian if ompt_max_active_levels != icv_value: 303*f98ee40fSTobias Hieta print( 304*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: omp_max_active_levels (%d) does not match OMPD max active levels (%d)!" 305*f98ee40fSTobias Hieta % (ompt_max_active_levels, icv_value) 306*f98ee40fSTobias Hieta ) 307d2a6e165SVignesh Balasubramanian 308d2a6e165SVignesh Balasubramanian # compare omp_kind: TODO: Add the test for monotonic/nonmonotonic modifier 309*f98ee40fSTobias Hieta if "omp_kind" in field_names and "run-sched-var" in self.icv_map: 310*f98ee40fSTobias Hieta ompt_sched_kind = thread_data["omp_kind"] 311*f98ee40fSTobias Hieta icv_value = ompdModule.call_ompd_get_icv_string_from_scope( 312*f98ee40fSTobias Hieta curr_thread.get_current_task_handle(), 313*f98ee40fSTobias Hieta self.icv_map["run-sched-var"][1], 314*f98ee40fSTobias Hieta self.icv_map["run-sched-var"][0], 315*f98ee40fSTobias Hieta ) 316*f98ee40fSTobias Hieta ompd_sched_kind = icv_value.split(",")[0] 317d2a6e165SVignesh Balasubramanian if self.sched_map.get(int(ompt_sched_kind)) != ompd_sched_kind: 318*f98ee40fSTobias Hieta print( 319*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: omp_kind kind (%s) does not match OMPD schedule kind according to ICVs (%s)!" 320*f98ee40fSTobias Hieta % (self.sched_map.get(int(ompt_sched_kind)), ompd_sched_kind) 321*f98ee40fSTobias Hieta ) 322d2a6e165SVignesh Balasubramanian 323d2a6e165SVignesh Balasubramanian # compare omp_modifier 324*f98ee40fSTobias Hieta if "omp_modifier" in field_names and "run-sched-var" in self.icv_map: 325*f98ee40fSTobias Hieta ompt_sched_mod = thread_data["omp_modifier"] 326*f98ee40fSTobias Hieta icv_value = ompdModule.call_ompd_get_icv_string_from_scope( 327*f98ee40fSTobias Hieta curr_thread.get_current_task_handle(), 328*f98ee40fSTobias Hieta self.icv_map["run-sched-var"][1], 329*f98ee40fSTobias Hieta self.icv_map["run-sched-var"][0], 330*f98ee40fSTobias Hieta ) 331*f98ee40fSTobias Hieta token = icv_value.split(",")[1] 332d2a6e165SVignesh Balasubramanian if token is not None: 333d2a6e165SVignesh Balasubramanian ompd_sched_mod = int(token) 334d2a6e165SVignesh Balasubramanian else: 335d2a6e165SVignesh Balasubramanian ompd_sched_mod = 0 336d2a6e165SVignesh Balasubramanian if ompt_sched_mod != ompd_sched_mod: 337*f98ee40fSTobias Hieta print( 338*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: omp_kind modifier does not match OMPD schedule modifier according to ICVs!" 339*f98ee40fSTobias Hieta ) 340d2a6e165SVignesh Balasubramanian 341d2a6e165SVignesh Balasubramanian # compare omp_proc_bind 342*f98ee40fSTobias Hieta if "omp_proc_bind" in field_names and "bind-var" in self.icv_map: 343*f98ee40fSTobias Hieta ompt_proc_bind = thread_data["omp_proc_bind"] 344*f98ee40fSTobias Hieta icv_value = ompdModule.call_ompd_get_icv_from_scope( 345*f98ee40fSTobias Hieta curr_thread.get_current_task_handle(), 346*f98ee40fSTobias Hieta self.icv_map["bind-var"][1], 347*f98ee40fSTobias Hieta self.icv_map["bind-var"][0], 348*f98ee40fSTobias Hieta ) 349d2a6e165SVignesh Balasubramanian if icv_value is None: 350*f98ee40fSTobias Hieta icv_string = ompdModule.call_ompd_get_icv_string_from_scope( 351*f98ee40fSTobias Hieta curr_thread.get_current_task_handle(), 352*f98ee40fSTobias Hieta self.icv_map["bind-var"][1], 353*f98ee40fSTobias Hieta self.icv_map["bind-var"][0], 354*f98ee40fSTobias Hieta ) 355d2a6e165SVignesh Balasubramanian if icv_string is None: 356*f98ee40fSTobias Hieta print( 357*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: omp_proc_bind (%d) does not match OMPD proc bind according to ICVs (None Object)" 358*f98ee40fSTobias Hieta % (ompt_proc_bind) 359*f98ee40fSTobias Hieta ) 360d2a6e165SVignesh Balasubramanian else: 361*f98ee40fSTobias Hieta if ompt_proc_bind != int(icv_string.split(",")[0]): 362*f98ee40fSTobias Hieta print( 363*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: omp_proc_bind (%d) does not match OMPD proc bind according to ICVs (%d)!" 364*f98ee40fSTobias Hieta % (ompt_proc_bind, int(icv_string.split(",")[0])) 365*f98ee40fSTobias Hieta ) 366d2a6e165SVignesh Balasubramanian else: 367d2a6e165SVignesh Balasubramanian if ompt_proc_bind != icv_value: 368*f98ee40fSTobias Hieta print( 369*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: omp_proc_bind (%d) does not match OMPD proc bind according to ICVs (%d)!" 370*f98ee40fSTobias Hieta % (ompt_proc_bind, icv_value) 371*f98ee40fSTobias Hieta ) 372d2a6e165SVignesh Balasubramanian 373d2a6e165SVignesh Balasubramanian # compare enter and exit frames 374*f98ee40fSTobias Hieta if "ompt_frame_list" in field_names: 375*f98ee40fSTobias Hieta ompt_task_frame_dict = thread_data["ompt_frame_list"].dereference() 376*f98ee40fSTobias Hieta ompt_task_frames = ( 377*f98ee40fSTobias Hieta int(ompt_task_frame_dict["enter_frame"].cast(gdb.lookup_type("long"))), 378*f98ee40fSTobias Hieta int(ompt_task_frame_dict["exit_frame"].cast(gdb.lookup_type("long"))), 379*f98ee40fSTobias Hieta ) 380d2a6e165SVignesh Balasubramanian current_task = curr_thread.get_current_task() 381d2a6e165SVignesh Balasubramanian ompd_task_frames = current_task.get_task_frame() 382d2a6e165SVignesh Balasubramanian if ompt_task_frames != ompd_task_frames: 383*f98ee40fSTobias Hieta print( 384*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: ompt_task_frames (%s) do not match OMPD task frames (%s)!" 385*f98ee40fSTobias Hieta % (ompt_task_frames, ompd_task_frames) 386*f98ee40fSTobias Hieta ) 387d2a6e165SVignesh Balasubramanian 388d2a6e165SVignesh Balasubramanian # compare task data 389*f98ee40fSTobias Hieta if "ompt_task_data" in field_names: 390*f98ee40fSTobias Hieta ompt_task_data = thread_data["ompt_task_data"].dereference()["value"] 391d2a6e165SVignesh Balasubramanian current_task_handle = curr_thread.get_current_task_handle() 392d2a6e165SVignesh Balasubramanian ompd_value = ompdModule.call_ompd_get_tool_data(6, current_task_handle)[0] 393d2a6e165SVignesh Balasubramanian if ompt_task_data != ompd_value: 394*f98ee40fSTobias Hieta print( 395*f98ee40fSTobias Hieta "OMPT-OMPD mismatch: value of ompt_task_data (%d) does not match that of OMPD data union (%d)!" 396*f98ee40fSTobias Hieta % (ompt_task_data, ompd_value) 397*f98ee40fSTobias Hieta ) 398d2a6e165SVignesh Balasubramanian 399d2a6e165SVignesh Balasubramanian def save_thread_object(self, thread_num, thread_id, addr_space): 400*f98ee40fSTobias Hieta """Saves thread object for thread_num inside threads dictionary.""" 401d2a6e165SVignesh Balasubramanian thread_handle = ompdModule.get_thread_handle(thread_id, addr_space) 402d2a6e165SVignesh Balasubramanian self.threads[int(thread_num)] = ompd_thread(thread_handle) 403d2a6e165SVignesh Balasubramanian 404d2a6e165SVignesh Balasubramanian def get_thread(self, thread_num): 405*f98ee40fSTobias Hieta """Get thread object from map.""" 406d2a6e165SVignesh Balasubramanian return self.threads[int(thread_num)] 407d2a6e165SVignesh Balasubramanian 408d2a6e165SVignesh Balasubramanian def get_curr_thread(self): 409*f98ee40fSTobias Hieta """Get current thread object from map or add new one to map, if missing.""" 410d2a6e165SVignesh Balasubramanian thread_num = int(gdb.selected_thread().num) 411d2a6e165SVignesh Balasubramanian if thread_num not in self.threads: 412d2a6e165SVignesh Balasubramanian self.add_thread() 413d2a6e165SVignesh Balasubramanian return self.threads[thread_num] 414d2a6e165SVignesh Balasubramanian 415d2a6e165SVignesh Balasubramanian def add_thread(self): 416*f98ee40fSTobias Hieta """Add currently selected (*) thread to dictionary threads.""" 417d2a6e165SVignesh Balasubramanian inf_thread = gdb.selected_thread() 418d2a6e165SVignesh Balasubramanian try: 419d2a6e165SVignesh Balasubramanian self.save_thread_object(inf_thread.num, inf_thread.ptid[1], self.addr_space) 420d2a6e165SVignesh Balasubramanian except: 421d2a6e165SVignesh Balasubramanian traceback.print_exc() 422d2a6e165SVignesh Balasubramanian 423d2a6e165SVignesh Balasubramanian def list_threads(self, verbose): 424d2a6e165SVignesh Balasubramanian """Prints OpenMP threads only that are being tracking inside the "threads" dictionary. 425d2a6e165SVignesh Balasubramanian See handle_stop_event and add_thread. 426d2a6e165SVignesh Balasubramanian """ 427d2a6e165SVignesh Balasubramanian list_tids = [] 428d2a6e165SVignesh Balasubramanian curr_inferior = gdb.selected_inferior() 429d2a6e165SVignesh Balasubramanian 430d2a6e165SVignesh Balasubramanian for inf_thread in curr_inferior.threads(): 431d2a6e165SVignesh Balasubramanian list_tids.append((inf_thread.num, inf_thread.ptid)) 432d2a6e165SVignesh Balasubramanian if verbose: 433d2a6e165SVignesh Balasubramanian if self.states is None: 434d2a6e165SVignesh Balasubramanian self.enumerate_states() 435d2a6e165SVignesh Balasubramanian for (thread_num, thread_ptid) in sorted(list_tids): 436d2a6e165SVignesh Balasubramanian if thread_num in self.threads: 437d2a6e165SVignesh Balasubramanian try: 438*f98ee40fSTobias Hieta print( 439*f98ee40fSTobias Hieta "Thread %i (%i) is an OpenMP thread; state: %s" 440*f98ee40fSTobias Hieta % ( 441*f98ee40fSTobias Hieta thread_num, 442*f98ee40fSTobias Hieta thread_ptid[1], 443*f98ee40fSTobias Hieta self.states[self.threads[thread_num].get_state()[0]], 444*f98ee40fSTobias Hieta ) 445*f98ee40fSTobias Hieta ) 446d2a6e165SVignesh Balasubramanian except: 447d2a6e165SVignesh Balasubramanian traceback.print_exc() 448d2a6e165SVignesh Balasubramanian else: 449*f98ee40fSTobias Hieta print( 450*f98ee40fSTobias Hieta "Thread %i (%i) is no OpenMP thread" 451*f98ee40fSTobias Hieta % (thread_num, thread_ptid[1]) 452*f98ee40fSTobias Hieta ) 453d2a6e165SVignesh Balasubramanian 454d2a6e165SVignesh Balasubramanian def enumerate_states(self): 455d2a6e165SVignesh Balasubramanian """Helper function for list_threads: initializes map of OMPD states for output of 456d2a6e165SVignesh Balasubramanian 'ompd threads'. 457d2a6e165SVignesh Balasubramanian """ 458d2a6e165SVignesh Balasubramanian if self.states is None: 459d2a6e165SVignesh Balasubramanian self.states = {} 460d2a6e165SVignesh Balasubramanian current = int("0x102", 0) 461d2a6e165SVignesh Balasubramanian count = 0 462d2a6e165SVignesh Balasubramanian more = 1 463d2a6e165SVignesh Balasubramanian 464d2a6e165SVignesh Balasubramanian while more > 0: 465d2a6e165SVignesh Balasubramanian tup = ompdModule.call_ompd_enumerate_states(self.addr_space, current) 466d2a6e165SVignesh Balasubramanian (next_state, next_state_name, more) = tup 467d2a6e165SVignesh Balasubramanian 468d2a6e165SVignesh Balasubramanian self.states[next_state] = next_state_name 469d2a6e165SVignesh Balasubramanian current = next_state 470