Я не знаю, как обстоят дела с CUDA 4.0, но в 3.2 вы просто не можете вычесть, если это указатель CPU или GPU, основанный исключительно на адресе, хранящемся в нем.
Обходным путем было бы создать класс CudaPtr<T>
, спрятать там указатель и предоставить базовые функции (например, memset
, memload
, memstore
, memalloc
и т. Д., Которые, в свою очередь, использовали бы CUDA). прочее).
Тогда, если у вас есть функция, которая может работать на хосте или на устройстве, вы можете легко перегрузить ее для T*
и CudaPtr<T>
.
Обновление: Со времени Unified Memory Addressing и нового инструментария CUDA все немного изменилось. Кажется, теперь вы можете сделать такое различие во время выполнения через cuPointerGetAttribute