Как использовать хук, чтобы перехватить cudaSetDevice и изменить идентификатор устройства? - PullRequest
0 голосов
/ 10 апреля 2019

Я хочу перехватить cudaSetDevice с перехватом (LD_PRELOAD) и изменить идентификатор устройства.После того, как угон прошел успешно, отправка задачи gpu будет неправильной.

Я попытался перехватить функцию cuCtxCreate в драйвере API, но я не смог ее перехватить.Тот же метод перехватывает функцию cuDevicePrimaryCtxRetain, которая может быть перехвачена, и при изменении идентификатора устройства будет возникать ошибка.

// cuda 9.0 cuda runtime api   
typedef int(*cuda_set_device_fp)(int);

// define dynamic library same name function
int cudaSetDevice(int device)
{
  static void *handle = NULL;
  static cuda_set_device_fp orig_cuda_set_device = NULL;

  if( !handle )
  {
    handle = dlopen("libcuda.so", RTLD_LAZY);
    orig_cuda_set_device = (cuda_set_device_fp)dlsym(handle, "cudaSetDevice");
  }
  device = 1;
  printf("oops!!! hack function invoked. device = %d\n", device);
  return cudaSetDevice(device);
}

Перехват успешно завершен, сопоставление пользователя с задачей gpu на устройстве 0 и повторное сопоставлениек устройству 1.

1 Ответ

1 голос
/ 10 апреля 2019

В предоставленном исходном коде в конце вашей функции вы рекурсивно вызываете свою функцию снова, вместо вызова orig_cuda_set_device с измененным идентификатором устройства.Это вызывает бесконечную рекурсию.

...