NVlabs / NVBit

198 stars 18 forks source link

Loading NVBit tool with dlopen() explicitly #108

Open hgpatil opened 1 year ago

hgpatil commented 1 year ago

Hi:

Instead of using LD_PRELOAD, I am explicitly doing an dlopen() of an NVBit tool .so from a driver program and then calling nvbit_at_init() function from the loaded .so. While this sequence works, the actual GPU code instrumentation is not happening. Are there any other functions I need to be calling explicitly after the dlopen()?

-Harish

hgpatil commented 1 year ago

More details: The driver program also does atexit(<pointer to nvbit_at_term) For the instr_count.so, this is the sequence of events: After the .so is loaded with dlopen(): the banner "--NVBit ... Loaded--" is output After a call to nvbit_at_init: information about various environment variables (INSTR_BEGIN/END ...) is printed.

Output from nvbit_at_term() Total app instructions: 0 The flow seems to match a run with LD_PRELOAD=inst_count.so except no kernel instrumentation message is seen and the final instruction count is 0.
coppock commented 3 months ago

libnvbit dlopen()s itself (NULL) in order to find nvbit_* callbacks defined in the tool. I'm loading a tool via LD_LIBRARY_PATH, which may be similar to what you're doing with dlopen(). Anyway, my tool didn't work until I explicitly added a dlopen() (in an __attribute__((constructor))) with the RTLD_GLOBAL flag set. Maybe LD_PRELOAD adds the library to its own DL searches, but LD_LIBRARY_PATH/dlopen() doesn't?