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之后标量参数不需要生存,那就太好了,但文档似乎并不是很清楚。
答案 0 :(得分:2)
如果指针模式是HOST,则alpha和beta可以在堆栈上或在堆上分配。在内核下面将启动alpha和beta的值。因此,如果它们在堆上分配,则可以在调用返回后立即释放它们(即使内核启动是异步的)
如果指针是DEVICE,则必须在设备上访问alpha和beta,并且在内核完成之前不应修改它们的值。请注意,由于cudaFree执行隐式cudaDeviceSynchronize(),因此在调用之后仍然可以调用alpha / beta的cudaFree,但在这种情况下它会违反DEVICE指针模式的目的。