Насколько велика cudaStream_t?

Я унаследовал некоторый код, который в основном делает такие вещи:

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>Поэтому я надеюсь прояснить технические вопросы здесь.)

1

Решение

Насколько большой 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 *, действительно?

3

Другие решения

Других решений пока нет …