CUBLAS中的异步和内存所有权

时间:2014-08-01 00:07:34

标签: cuda cublas

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可能不存在:如果我们在Saxpy启动之前从函数返回,并且alpha的堆栈空间被其他东西覆盖,那么Saxpy可能会得到错误的答案(甚至崩溃)。

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

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

1 个答案:

答案 0 :(得分:2)

如果指针模式是HOST,则alpha和beta可以在堆栈上或在堆上分配。在内核下面将启动alpha和beta的值。因此,如果它们在堆上分配,则可以在调用返回后立即释放它们(即使内核启动是异步的)

如果指针是DEVICE,则必须在设备上访问alpha和beta,并且在内核完成之前不应修改它们的值。请注意,由于cudaFree执行隐式cudaDeviceSynchronize(),因此在调用之后仍然可以调用alpha / beta的cudaFree,但在这种情况下它会违反DEVICE指针模式的目的。