我在集成分支上使用cuda设备,在完成工作时仍然存在段故障。如何避免与Cuda发生segfault内存泄漏
每次崩溃后,我的内存消耗增加了500Mo(使用free -m
,htop
和另一个,但我不记得名字)。这个内存不会在这台带有4Go内存的计算机上被释放,所以我必须在一些崩溃之后重新启动,否则内存交换和它真的非常慢(通常当内存交换发生时)。
我知道很好的答案是:“修复你的段错误!”但我想了解为什么会发生这种情况,我该如何预防这种情况。
我读过CUDA内存应该由segfault上的操作系统发布,它看起来好像没有。当我尝试调试我的程序时,我注意到如果我修复了段错误,内存是正确释放的,但是如果我也对cuda发行版发表评论:cudaFreeHost(buf)
(seg段已修复),我仍然有内存泄漏。
我的记忆被分配为固定页面:cudaHostAlloc(&ret, n*sizeof(my_struct), cudaHostAllocPortable)
。
我想确保使用unique_ptr
调用“免费”代码,但它不会解决segfault的问题。
我看着CUDA的持久模式:http://docs.nvidia.com/deploy/driver-persistence/index.html,但它在我的计算机上禁用(我使用nvidia-smi
进行了检查)。
我试图重置cuda设备:nvidia-smi -r
但它表示它不支持我的电脑。
问题是:
- 我们怎么能要求的程序(或OS)在程序结束时释放这些资源?
- 如果我们不能,命令是否存在以在崩溃后恢复这些资源?
版:
CUDA 6.0.1
GCC 4.9.2
驱动程序版本:340.65
卡:610M的GeForce
更新:
这里是一个示例代码来重现该问题。有评论的话,我每次跑10MO。
#include <cuda.h>
#include <cuda_runtime.h>
int main() {
int *ret;
cudaHostAlloc(&ret, 10000000 * sizeof(*ret), cudaHostAllocPortable);
//cudaFreeHost(ret);
return 0;
}
更新2:
total used free shared buffers cached
Mem: 3830056 1487156 2342900 66336 142840 527088
-/+ buffers/cache: 817228 3012828
Swap: 7811068 0 7811068
1Erreur de segmentation
2Erreur de segmentation
3Erreur de segmentation
4Erreur de segmentation
5Erreur de segmentation
6Erreur de segmentation
7Erreur de segmentation
8Erreur de segmentation
9Erreur de segmentation
10Erreur de segmentation
11Erreur de segmentation
12Erreur de segmentation
13Erreur de segmentation
14Erreur de segmentation
15Erreur de segmentation
16Erreur de segmentation
17Erreur de segmentation
18Erreur de segmentation
19Erreur de segmentation
20Erreur de segmentation
total used free shared buffers cached
Mem: 3830056 1766580 2063476 64152 142860 531032
-/+ buffers/cache: 1092688 2737368
Swap: 7811068 0 7811068
你能发布其示出了明显的内存泄漏短REPRO情况?我不确定你对这里发生的事情的诊断是正确的,也可能是你误解了发生的事情。此外,你正在运行一个两岁的CUDA工具包和一个一岁的驱动程序。你有没有考虑过升级以查看行为是否相同? – talonmies
我添加了一个示例代码repro case。我同意,CUDA版本应该是最新的,但我没有时间做这个迁移。我可能/会试图去做,看看它是否会再次发生。 –
我有一个64位系统上与352.39驱动程序和CUDA 6运行RAM和16GB运行代码,在shell循环1000次,并没有发现内存泄露的。我不知道你的代码或你的系统正在发生什么,但是CUDA不会按照你所建议的方式泄漏主机内存。 – talonmies