我继承了一些代码,基本上可以完成以下工作:
void *stream;
cudaStreamCreate((cudaStream_t *)&stream);
查看CUDA 8的
targets/x86_64-linux/driver_types.h
,我看到:typedef __device_builtin__ struct CUStream_st *cudaStream_t;
据我所知,强制转换将起作用,但是我担心这种转换可能会过时,以及将代码移植到ARM时是否安全。上面的代码有多危险?
__device_builtin__
会影响什么吗?(注意:我计划直接与开发人员联系,并告诉他们在整个过程中都使用
cudaStream_t
和#include <cuda_runtime.h>
,所以我希望在这里澄清技术问题。) 最佳答案
就像你观察到的那样
typedef __device_builtin__ struct CUStream_st *cudaStream_t;
因此它是一个指针,并且具有指针的大小,即在当今的典型体系结构上为64位,而在其他体系结构上则为不同的大小。但是您真的需要利用这些信息吗?我猜不会。
然后使其:
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是指针-只需将其视为不透明的对象即可。
这很危险,但这不是因为移植,而是因为无效的假设,就像我说的那样。这样说,危险就不那么大了
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/