cublas如何实现异步标量变量传输

Posted

技术标签:

【中文标题】cublas如何实现异步标量变量传输【英文标题】:how does cublas implement asynchronous scalar variable transmission 【发布时间】:2014-03-13 01:19:43 【问题描述】:

在许多 cublas 或 cusparse 函数调用中,它们使用标量变量,我们可以传入主机指针或设备指针,例如此处的 alpha 和 beta 变量 http://docs.nvidia.com/cuda/cublas/#cublas-lt-t-gt-gemm

这实际上是如何实现的?如果数据在主机中,我认为它需要在设备上分配内存,然后调用 cudaMemcpyAsync 来复制数据。但是,执行 cudaMalloc 会使函数调用同步。我们该如何解决这个问题?

【问题讨论】:

【参考方案1】:

如果它是一个主机驻留标量,它可以作为内核参数按值传递。如果它是设备驻留的,则可以将指向它的指针作为内核参数传递。

【讨论】:

我明白了,你的意思是如果它是一个主机驻留标量,那么内核将使用的值是在调用内核时获取的?如果是这种情况,那么我不允许从设备到主机进行异步内存复制,然后将目标主机地址传递给像 cublas gemm 这样的函数? 传递给 C 中函数的参数在调用函数时应该是有效的。内核也是如此。如果我们只讨论内核调用,那么在同一个流中发出的异步 memcopy 就可以了,因为(甚至 aync)对同一个流发出的调用都是序列化的。在先前发出的 cudaMemcpyAsync 操作完成之前,该流中的后续内核调用不会开始。但是调用 cublas 函数与裸内核调用不同。将其视为 c 函数。无论如何,这一切似乎都超出了您最初问题的重点。 谢谢。只是为了确认一下,你的意思是如果我在cublasSgemm(..., &h_alpha, ...);之后执行cudaMemcpyAsync(&h_alpha, &d_alpha, cudaMemcpyDeviceToHost);,它不会起作用,因为h_alpha的值在调用时立即被cublasSgemm获取,这可能发生在内存复制之前? cudaMemcpyAsync 立即将控制权返回给调用线程,无需等待 memcpy 操作完成。 cublasSgemm 是一个普通的 C API 函数调用。我不能告诉你它是否会起作用。但我不会那样做。我不打算继续回答 cmets 中提出的新问题。我试图回答你原来的问题。如果数据通过内核参数传输,则将数据传输到内核不需要cudaMalloc/cudaMemcpy 操作。 谢谢。我只是想让我的库的行为与现有库完全相同。到现在我还对标量参数的实现感到疑惑。

以上是关于cublas如何实现异步标量变量传输的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CUBLAS 对复数执行 Hadamard 乘积?

深入理解消息队列:如何实现高性能的异步网络传输?

系统学习消息队列分享(十) 如何实现高性能的异步网络传输?

非阻塞套接字实现的文件传输程序

如何更完整地实现一个异步FIFO-功能实现,仿真及时序约束

如何使用 blas 以最佳方式转置矩阵?