Я унаследовал некоторый код, который в основном делает такие вещи:
void *stream;
cudaStreamCreate((cudaStream_t *)&stream);
Смотря на targets/x86_64-linux/driver_types.h
для CUDA 8 я вижу:
typedef __device_builtin__ struct CUStream_st *cudaStream_t;
Насколько я понимаю, приведение будет работать, но я беспокоюсь о том, насколько это может быть в будущем, а также о том, безопасно ли это, когда код переносится в ARM. Насколько опасен приведенный выше код? Ли __device_builtin__
повлиять на что-нибудь?
(Примечание: я планирую поговорить с разработчиком напрямую и сказать им, чтобы использовать cudaStream_t
во всем и #include <cuda_runtime.h>
Поэтому я надеюсь прояснить технические вопросы здесь.)
Насколько большой
cudaStream_t
?
Как вы заметили,
typedef __device_builtin__ struct CUStream_st *cudaStream_t;
Таким образом, это указатель и имеет размер указателя, то есть 64 бита на типичных архитектурах сегодня, но разные размеры на других архитектурах. Но вам действительно нужно использовать эту информацию? Я бы не догадался.
Насколько я понимаю, актерский состав будет работать, но я беспокоюсь о том, насколько это может быть в будущем.
Тогда сделайте это:
cudaStream_t stream;
cudaStreamCreate(&stream);
или используйте C ++ ‘ish API оболочки, например.:
auto device = cuda::device::current::get();
auto stream = device.create_stream(cuda::stream::sync);
где это отвлечено, и stream_t
в любом случае это обертка, а не указатель (предостережение: я являюсь автором библиотеки обёрток)
Я бы беспокоился не о несовместимости, а об избежании неверных предположений. И действительно, Вы не должны предполагать, что cudaStream_t является указателем — просто рассматривайте его как нечто непрозрачное.
а также, если это безопасно, когда код переносится в ARM. Насколько опасен приведенный выше код?
Это опасно, но не из-за портирования, а, как я уже сказал, из-за неверного предположения. Это было бы менее опасно, скажем,
static_assert(sizeof(void*) == sizeof(cudaStream_t),
"Unexpected size of cudaStream_t - not the same as void *");
но почему ты настаиваешь на void *
, действительно?
Других решений пока нет …