【发布时间】:2018-03-05 03:04:57
【问题描述】:
我继承了一些基本上做这样的事情的代码:
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>,所以我希望在这里澄清技术问题。)
【问题讨论】:
-
我认为该代码没有问题。这有点像
void * mem = malloc(5*sizeof(int));。我想说这实际上是相当安全的,因为取消引用指向void的指针会触发警告。我看到的问题是冗长,因为您现在必须将代码乱扔到cudaStream_t*。 -
演员保证按标准工作:eel.is/c++draft/basic.compound#5
-
@HenriMenke
__device_builtin__属性会影响事物吗? -
这只是一个影响
ptxas代码生成的属性(就像函数的__host__和__device__一样)。 -
这当然取决于 CUDA 将
cudaStream_t定义为指针类型。如果这种情况发生变化,代码可能会中断。可能是 CUDA 提供了cudaStream_t将始终是指针类型的保证,但我无法确定这样的保证。我不确定为什么有人会选择这种编码方法而不是cudaStream_t stream;
标签: c++ cuda portability void-pointers cuda-streams