1

我继承了一些基本上可以执行以下操作的代码:

void *stream;
cudaStreamCreate((cudaStream_t *)&stream);

看着targets/x86_64-linux/driver_types.hCUDA 8,我看到:

typedef __device_builtin__ struct CUStream_st *cudaStream_t;

据我了解,演员阵容会起作用,但我担心这可能会如何面向未来,以及将代码移植到 ARM 时是否安全。上面的代码有多危险?有__device_builtin__什么影响吗?

(注意:我打算直接和开发者交谈,告诉他们在cudaStream_t整个过程中使用 and #include <cuda_runtime.h>,所以我希望在这里澄清技术问题。)

4

1 回答 1

3

有多大cudaStream_t

就像你观察到的,

typedef __device_builtin__ struct CUStream_st *cudaStream_t;

所以它是一个指针,并且具有指针的大小,即在今天的典型架构上是 64 位,但在其他架构上是不同的大小。但是你真的需要利用这些信息吗?我猜不会。

据我了解,演员阵容会起作用,但我担心这可能会如何适应未来

然后制作它:

cudaStream_t stream;
cudaStreamCreate(&stream);

或使用C++'ish API 包装器,例如:

auto device = cuda::device::current::get();
auto stream = device.create_stream(cuda::stream::sync);

无论如何,这是抽象出来的,并且stream_t是包装器,而不是指针(警告:我是包装器库的作者。)

我担心的不是不兼容,而是避免无效的假设。而且,确实,您不应该假设 cudaStream_t 是一个指针 - 只需将其视为不透明的东西。

以及将代码移植到ARM时是否安全。上面的代码有多危险?

这很危险,但不是因为移植,而是就像我说的,因为假设无效。比如说,它会不那么危险

static_assert(sizeof(void*) == sizeof(cudaStream_t),
    "Unexpected size of cudaStream_t - not the same as void *");

但你为什么要坚持void *,真的吗?

于 2018-03-06T15:46:34.883 回答