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

Cuda cublas如何实现异步标量变量传输,cuda,cublas,Cuda,Cublas,在许多cublas或cusparse函数调用中,它们使用标量变量,我们可以在主机指针或设备指针中传递这些变量,例如这里的alpha和beta变量 这实际上是如何实现的?如果数据在主机中,我假设它需要在设备上分配内存,然后调用cudaMemcpyAsync来复制数据。但是,执行cudamaloc会使函数调用同步。我们如何解决这个问题呢?如果它是驻留在主机上的标量,则可以通过值作为内核参数进行传递。如果它是驻留在设备上的,那么指向它的指针可以作为内核参数传递。我明白了,你的意思是如果它是驻留在主机

在许多cublas或cusparse函数调用中,它们使用标量变量,我们可以在主机指针或设备指针中传递这些变量,例如这里的alpha和beta变量


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

如果它是驻留在主机上的标量,则可以通过值作为内核参数进行传递。如果它是驻留在设备上的,那么指向它的指针可以作为内核参数传递。

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