我继承了一些基本上做这样的事情的代码:
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>
,所以我希望在这里澄清技术问题。)
最佳答案
How big is a
cudaStream_t
?
正如您所观察到的,
typedef __device_builtin__ struct CUStream_st *cudaStream_t;
所以它是一个指针,并且具有指针的大小,即在当今的典型体系结构中为 64 位,但在其他体系结构中大小不同。但是你真的需要利用这些信息吗?我猜不会。
As far as I understand it, the cast will work, but I worry about how future-proof this may be
然后制作:
cudaStream_t stream;
cudaStreamCreate(&stream);
或使用 C++'ish API wrappers ,例如:
auto device = cuda::device::current::get();
auto stream = device.create_stream(cuda::stream::sync);
在那里它被抽象掉了,stream_t
是一个包装器,而不是一个指针,无论如何(警告:我是包装器库的作者。)
我担心的不是不兼容,而是避免无效的假设。而且,事实上,您不应该假设 cudaStream_t 是一个指针 - 只需将其视为不透明的东西即可。
and also if it is safe when the code is ported to ARM. How dangerous is the above code?
这很危险,但不是因为移植,而是如我所说,因为假设无效。比方说,
static_assert(sizeof(void*) == sizeof(cudaStream_t),
"Unexpected size of cudaStream_t - not the same as void *");
但是你为什么要坚持 void *
,真的吗?
关于c++ - cudaStream_t 有多大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49102916/