CUBLAS中的异步和内存所有权

3

CUBLAS是一个异步库。对于传递给CUBLAS的参数,需要满足什么内存所有权要求?

显然,在CUBLAS操作的矩阵完成异步调用之前,这些矩阵不应该被释放,但标量参数呢?

例如,下面的代码是否正确:

//...
float alpha = compute_alpha();
cublasSaxpy(handle, n, 

            //Taking the address of an automatic variable!
            &alpha, //and handing it to an asynchronous function!

            x, incx,
            y, incy);
return;

我担心在 Saxpy 实际启动之前 alpha 可能会不存在:如果我们在函数返回之前返回,且存储 alpha 的栈空间被其他东西覆盖,那么 Saxpy 可能会得到错误的答案(甚至崩溃)。

我不想将标量参数复制到某种堆内存中,并确保它们在异步调用 CUBLAS 后不被销毁 - 跟踪这一点会很复杂。

如果 CUBLAS 明确保证标量参数在调用 CUBLAS 后不需要继续存在,那就太好了,但文档似乎并不是非常清楚。


1
这可能会引起兴趣。不是一个答案; 我猜这是对文档的请求。思想实验假设底层调用cudaLaunch,似乎表明标量是安全的,并且最终必须按值传递。唯一的问题是如果主机指向标量的指针在底层的cudaMemcpyAsync中,这对我来说似乎不太可能。 - Robert Crovella
1个回答

2
如果指针模式为HOST,alpha和beta可以在堆栈上或分配在堆中。在内核下面将使用alpha和beta的值启动。因此,如果它们被分配在堆中,则可以在调用返回后立即释放它们(即使内核启动是异步的)。
如果指针为DEVICE,则必须在设备上访问alpha和beta,并且在内核完成之前不应修改其值。请注意,由于cudaFree执行隐式的cudaDeviceSynchronize(),因此可以在调用后立即调用alpha/beta的cudaFree,但在这种情况下会失去DEVICE指针模式的目的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接