gpt4 book ai didi

cuda - 在 CUDA 中调用内核后防止析构函数调用

转载 作者:行者123 更新时间:2023-12-04 04:40:08 25 4
gpt4 key购买 nike

考虑我的问题的这个简化版本:为了将数据传递给 CUDA 内核,我使用了一个类来保存数据和一个指向图形硬件上数据的指针。

class A {
int data;
float* dataOnGPU;
A() { cudaMalloc( dataOnGPU ... ); }
~A() { cudaFree( dataOnGPU ... ); }
};

void myFunction()
{
A obj;
kernelCall1<<<1,1>>>( obj );
kernelCall2<<<1,1>>>( obj ); // obj.dataOnGPU no longer points to valid memory

}

从第一个内核调用返回的结果是调用 obj 副本的析构函数(因为内核是按值调用的,这会创建一个副本)。这为 obj 及其副本释放了 dataOnGPU。 obj.dataOnGPU 的内存不应该是空闲的,直到 obj 超出范围。

当然,有可能避免这种情况,但我希望有良好而干净的 RAII 行为。有什么建议吗?

最佳答案

使用自定义复制构造函数是解决方案:

class A {
int data;
float* dataOnGPU;
bool isCopy;
A() { cudaMalloc( dataOnGPU ... ); isCopy = false; }
A( const A& _orig ) { *this = _orig; isCopy = true; }
~A() { if (!isCopy) cudaFree( dataOnGPU ... ); }
};

void myFunction()
{
A obj;
kernelCall1<<<1,1>>>( obj );
kernelCall2<<<1,1>>>( obj ); // obj.dataOnGPU still points to valid memory
}

感谢 Paul R 间接指出我这一点:)

关于cuda - 在 CUDA 中调用内核后防止析构函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19005360/

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