我继承了一些代码,基本上可以完成以下工作:

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/

10-11 01:15