cudaErrorIllegalAdress в профилировщике

У меня есть программа CUDA, которая использует тягу в некоторых местах, но также и обычные ядра.

Проблема в том, что когда я запускаю программу автономно, все работает нормально. Когда я запускаю его в профилировщике (визуальный профилировщик или строка cmd nvprof), программа вылетает в операции thrust::inclusive_scan с ошибкой cudaErrorIllegalAdress. Сбой происходит всегда в профилировщике и всегда в одной и той же позиции. Кроме того, у меня есть несколько итераций, таких как:

void foo(){ cudaProfilerStart();
  for(...){//...
    thrust::inclusive_scan(...);//...
  }
  cudaProfilerStop();
}
for(...) foo();

Сбой всегда происходит при первом вызове inclusive_scan во 2-й итерации.

Я использую CUDA 6.5 на Win7 с Quadro K5000.

Любые идеи, что может вызвать это или как сузить это? Может быть, способ получить адрес неудачного доступа? cuda-memcheck нельзя использовать с nvprof AFAIK(?)

Если я удаляю вызовы cudaProfilerStart/Stop, это, кажется, работает нормально. Как ни странно, сегодня утром они работали с ними, хотя я не вносил никаких изменений (сделал некоторое редактирование кода, но все изменил с помощью git). Также поведение не меняется, если я отключаю / включаю profile-from-start (с помощью cudaProfilerStart/Stop in место)

Минимальный рабочий пример:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>
#include <thrust/device_vector.h>
#include <cuda_profiler_api.h>

void foo(){
  thrust::device_vector<int> d_in(100), d_out(100);
  thrust::inclusive_scan(d_in.begin(), d_in.end(), d_out.begin());
  cudaError_t res = cudaDeviceSynchronize();
  std::cout << cudaGetErrorString(res) << std::endl;
}

int main(){
  cudaProfilerStart();
  foo();
  cudaProfilerStop();
  foo(); // Crash here

  cudaDeviceReset();

  return 0;
}

Еще несколько сценариев:
Начните(); Foo (); Стоп(); foo () вылет
Начните(); Foo (); Стоп(); Начните(); foo () ОК
Начните(); Foo (); Стоп(); any_other_kernel(); Начните(); foo () вылет

1 ответ

Решение

Такое поведение, по-видимому, связано с ограничением в CUDA 7.0 и более ранних системах профилирования. Исправление будет доступно в выпуске инструментария CUDA 7.5.

[Этот ответ был собран из комментариев и добавлен как запись вики сообщества, чтобы убрать вопрос из очереди без ответа]

Другие вопросы по тегам