我正在尝试 cudaMalloc 一堆设备指针,如果任何 malloc 不起作用,则优雅地退出。我有功能代码 - 但臃肿,因为如果失败,我必须 cudaFree 我之前 malloc 的所有内容。所以现在我想知道是否有更简洁的方法来实现这一点。显然,我无法释放尚未分配的东西 - 这肯定会导致问题。
下面是我试图使其变得更加优雅的代码片段。
//define device pointers
float d_norm, *d_dut, *d_stdt, *d_gamma, *d_zeta;
//allocate space on the device for the vectors and answer
if (cudaMalloc(&d_norm, sizeof(float)*vSize) != cudaSuccess) {
std::cout << "failed malloc";
return;
};
if (cudaMalloc(&d_data, sizeof(float)*vSize) != cudaSuccess) {
std::cout << "failed malloc";
cudaFree(d_norm);
return;
};
if (cudaMalloc(&d_stdt, sizeof(float)*wSize) != cudaSuccess) {
std::cout << "failed malloc";
cudaFree(d_norm);
cudaFree(d_data);
return;
};
if (cudaMalloc(&d_gamma, sizeof(float)*vSize) != cudaSuccess) {
std::cout << "failed malloc";
cudaFree(d_norm);
cudaFree(d_dut);
cudaFree(d_stdt);
return;
};
if (cudaMalloc(&d_zeta, sizeof(float)*w) != cudaSuccess) {
std::cout << "failed malloc";
cudaFree(d_norm);
cudaFree(d_dut);
cudaFree(d_stdt);
cudaFree(d_gamma);
return;
};
这是一个缩短的版本,但您可以看到它是如何不断构建的。实际上,我正在尝试分配大约 15 个数组。它开始变得丑陋 - 但它工作正常。
想法?
一些可能性:
cudaDeviceReset() http://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__DEVICE.html#group__CUDART__DEVICE_1gef69dd5c6d0206c2b8d099abac61f217将释放所有设备分配,而无需运行指针列表。
如果您打算退出(应用程序),则无论如何,所有设备分配都会在应用程序终止时自动释放。 cuda 运行时检测与应用程序的设备上下文关联的进程的终止,并在此时擦除该上下文。因此,如果您只是要退出,那么不执行任何操作应该是安全的cudaFree()
运营。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)