【问题标题】:How big is a cudaStream_t?cudaStream_t 有多大?
【发布时间】: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


【解决方案1】:

cudaStream_t 有多大?

正如你所观察到的,

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 是一个指针 - 只需将其视为不透明的东西。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2022-10-13
    • 2021-10-05
    • 2010-12-23
    • 2019-08-21
    • 1970-01-01
    • 2011-06-19
    • 2015-03-23
    • 2012-05-02
    • 2019-12-20
    相关资源
    最近更新 更多