Не удается создать вектор устройства тяги

#cuda #thrust

#cuda #тяга

Вопрос:

Итак, я пытаюсь начать с программирования на GPU и использования библиотеки Thrust для упрощения. Я создал тестовую программу для работы с ней и посмотреть, как это работает, однако всякий раз, когда я пытаюсь создать thrust::device_vector с ненулевым размером, программа завершает работу с «Ошибкой проверки во время выполнения # 3 — переменная ‘result’ используется без инициализации.’ (это происходит из allocator_traits .inl-файл) И… Я понятия не имею, как это исправить. Следующее — это все, что необходимо для возникновения этой ошибки.

 #include <thrust/device_vector.h>

int main()
{
    int N = 100;
    thrust::device_vector<int> d_a(N);
    return 0;
}
  

Я подозреваю, что это может быть проблема с тем, как настроена среда, поэтому подробности об этом…
Создан с использованием Visual Studio 2019, в проекте среды выполнения CUDA 11.0 (однако пример программы, приведенный при открытии этого проекта, работает нормально), версия Thrust 1.9, а данный графический процессор — GTX 970.

Комментарии:

1. Что произойдет, если вы измените на { thrust::device_vector<int> d_a(N); }

2. вы создаете отладочный проект? Попробуйте переключиться на проект выпуска. Если это проблема для вас, я рекомендую сообщить об ошибке по адресу developer.nvidia.com используя инструкции здесь . Черт возьми, в качестве простого теста я смог нажать «Игнорировать» в диалоговом окне и иным образом запустить / отладить программу CUDA. Вы также можете получить диалоговое окно в конце выполнения, которое вы также можете нажать Игнорировать. Похоже, это проявляется только в отладочном проекте. (И, возможно, только с CUDA 11. Я не смог воспроизвести проблему с CUDA 10.1)

3. Переключение на выпуск или игнорирование всплывающих окон сработало. Я не ожидал, что программа продолжит работу после этого просто отлично, но это имеет смысл, учитывая, что это указано как ошибка отладки. Большое вам спасибо!

Ответ №1:

Похоже, что эта проблема проявляется только в версии thrust (1.9.x), связанной с CUDA 11.0, и только в проектах отладки в Windows / Visual Studio.

Некоторые обходные пути заключаются в том, чтобы переключиться на создание проекта выпуска или просто нажать «Игнорировать» в диалоговых окнах, которые появляются во время выполнения. Согласно моему тестированию, это позволяет выполнять обычный запуск или отладку на этом этапе.

Я не подтвердил это, но я полагаю, что эта проблема исправлена в последней только что выпущенной тяге (1.10.x) (хотя на данный момент это не является частью какого-либо официального выпуска CUDA, я бы ожидал, что это будет частью какого-либо будущего выпуска CUDA).

Ответ №2:

Следуя ответу Роберта Кровеллы, я исправил эту проблему, изменив соответствующие строки кода в библиотеке thrust кодом из GitHub. Точнее, в файле …CUDAv11.1includethrustdetailallocatorallocator_traits.в Я заменил следующую функцию

 template<typename Alloc>
__host__ __device__
  typename disable_if<
    has_member_system<Alloc>::value,
    typename allocator_system<Alloc>::type
  >::type
    system(Alloc amp;)
{
  // return a copy of a default-constructed system
  typename allocator_system<Alloc>::type resu<
  return resu<
}
  

Автор:

 template<typename Alloc>
__host__ __device__
  typename disable_if<
    has_member_system<Alloc>::value,
    typename allocator_system<Alloc>::type
  >::type
    system(Alloc amp;)
{
  // return a copy of a default-constructed system
  return typename allocator_system<Alloc>::type();
}