c++ - cudaStream_t 有多大?

标签 c++ cuda portability void-pointers cuda-streams

我继承了一些基本上做这样的事情的代码:

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/

相关文章:

c++ - 混淆 myClass ** p1 和 myClass *p2[5]

cuda - CUDA 内核的 Uncrustify 命令

c++ - C++中double/float类型二进制序列化的可移植性

c++ - 如何处理不断发展的 C++ std::namespace?例如:std::tr1::shared_ptr 对比 std::shared_ptr 对比 boost::shared_ptr 对比 boost::tr1::shared_ptr

c - 当 sizeof(char) != 1 时,C 中的字节精度指针算法

c++ - C++ 如何使用 == 比较两个字符串?

java - 快速 C++ 数据到 Java 传输

c++ - 如何配置VC++ devenv.com命令行的Include/Lib目录?

cuda - __cudaRegisterFatBinary 和 __cudaRegisterFunction 函数的参数是什么?

python - PyCUDA 内核计时错误