Я пытаюсь адаптировать код, найденный здесь:
https://wiki.tiker.net/PyCuda/Examples/ThrustInterop
…использовать потоки CUDA.
(Пожалуйста, извините, что я новичок в c ++, и у меня есть несколько недель опыта только с cuda.)
Моя основная попытка и точка преткновения заключалась в том, чтобы настроить функцию NVCC следующим образом: получить поток cuda в виде аргумента и подать запрос на вызов Thrust:
nvcc_function = FunctionBody(
FunctionDeclaration(Value('void', 'my_sort'),
[Value('CUdeviceptr', 'input_ptr'),
Value('int', 'length'),
Value('cudaStream_t','stream')]),
Block([Statement('thrust::device_ptr<float> thrust_ptr((float*)input_ptr)'),
Statement('thrust::sort(thrust::cuda::par.on(stream),thrust_ptr, thrust_ptr+length)')]))
Я получаю ошибку «cudaStream_t не был объявлен» (ссылаясь на аргумент функции NVCC).
Я попытался добавить cuda_runtime.h в списки хоста и устройства, но безрезультатно.
Я не знаком с PyCUDA или тяги, но я знаком с CUDA. Одна из возможных вещей, которая приходит на ум, заключается в том, что по какой-то причине «cuda_runtime.h» может не быть включен, несмотря на то, что он указан. Вы уверены, что инфраструктура pyCUDA укажет на ошибку, когда она не может найти конкретное включение?
Еще одна вещь, которая привлекла мое внимание, это то, что вы используете CUdeviceptr
которая является частью driver api
, в то время как cudaStream_t
является частью runtime api
, который работает на другом уровне.
Из документации NVIDIA кажется, что driver api
эквивалентный тип будет CUstream
,
Источник: http://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__STREAM.html#group__CUDA__STREAM
Таким образом, проблема может заключаться в смешивании функциональности apis на разных уровнях. Как я уже сказал, я не знаком с точной структурой, которую вы используете, это лишь некоторые предложения, которые могут или не могут оказаться полезными.
Удачи с отладкой!
Других решений пока нет …