gpt4 book ai didi

c++ - 在cuda中有更好/更清洁/更优雅的malloc和free方式吗?

转载 作者:太空狗 更新时间:2023-10-29 23:39:11 33 4
gpt4 key购买 nike

我正在尝试 cudaMalloc 一堆设备指针,并在任何 mallocs 不起作用时优雅地退出。我有功能代码 - 但臃肿,因为如果一个失败,我必须 cudaFree 我以前 malloc'd 的一切。所以现在我想知道是否有更简洁的方法来完成这个。显然我不能释放没有被 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;
};

这是一个缩短的版本,但您可以看到它是如何不断构建的。实际上,我正在尝试 malloc 大约 15 个数组。它开始变得丑陋 - 但它工作正常。

想法?

最佳答案

一些可能性:

  1. cudaDeviceReset()将释放所有设备分配,您无需遍历指针列表。

  2. 如果您打算退出(应用程序),无论如何都会在应用程序终止时自动释放所有设备分配。 cuda 运行时检测与应用程序的设备上下文关联的进程的终止,并在该点删除该上下文。因此,如果您要退出,不执行任何 cudaFree() 操作应该是安全的。

关于c++ - 在cuda中有更好/更清洁/更优雅的malloc和free方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39395508/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com