【发布时间】:2017-01-16 15:44:59
【问题描述】:
我正在尝试 cudaMalloc 一堆设备指针,如果任何 malloc 不起作用,则优雅地退出。我有正常运行的代码——但是很臃肿,因为如果一个失败,我必须 cudaFree 以前 malloc'd 的所有内容。所以现在我想知道是否有更简洁的方法来实现这一点。显然我不能释放没有被 malloc 处理过的东西——那肯定会导致问题。
下面是我试图让代码更优雅的 sn-p。
//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;
};
这是一个缩短的版本,但您可以看到它是如何不断构建的。实际上,我正在尝试 malloc 大约 15 个数组。它开始变得丑陋 - 但它工作正常。
想法?
【问题讨论】:
-
使用
goto,卢克。 -
goto无助于跟踪已分配的指针列表与未分配的指针列表 -
一种简单的方法:将所有项目添加到矢量并在最后释放它们
-
或者您可以使用 RAII 并返回? (使用类似 unique_ptr 的东西)
-
我的意思有一个很好的例子:stackoverflow.com/questions/788903/… 但是如果它是 C++,当然 RAII 是更好的解决方案。很抱歉造成误导性评论。