Ubuntu 16.04LTS; SuiteSparse 4.5.5; CUDA 8.0.61(性能提升); Nvidia驱动程序384.98;
我已经将GPU加速的CHOLMOD成功实现到我的代码中,并且可以正常工作几个月。然后最近突然变色(对源代码没有更改),我开始在输出中看到这些错误:
GPU failure in cholmod_gpu: gpu_memorysize 8.38861e+06 0 MB
CHOLMOD error: gpu memorysize failure
. file: ../GPU/cholmod_gpu.c line: 384
CHOLMOD error: CUBLAS initialization. file: ../GPU/cholmod_gpu.c line: 433
CHOLMOD error: cudaMemcpy(d_Ls). file: ../Supernodal/../GPU/t_cholmod_gpu.c line: 129
CHOLMOD error: CUDA stream. file: ../Supernodal/../GPU/t_cholmod_gpu.c line: 140
我怀疑第三方图书馆在无人值守的情况下进行了自我更新。但是我对CHOLMOD / Demo / cholmod_l_demo(带有导出CHOLMOD_USE_GPU = 1)的测试证明,CHOLMOD本身运行良好,并且正在使用完整的GPU(使用nvidia-smi进行监视活动)。同样,Cuda /样本均工作正常。我已经清除并重新安装了所有组件,包括Cuda,Nvidia驱动程序和SuiteSparse。 Ive尝试了Cuda 8.0和Cuda 9.0的各种组合。无济于事,Cuda / samples和CHOLMOD / Demos仍然可以正常工作,但是我的CHOLMOD实现抛出相同的错误。
我已将问题追溯到cudaMemGetInfo()函数。由于某种原因,它将报告GPU上的0个可用字节,从而导致第一个错误(gpu_memorysize)!其余的错误似乎是从第一个开始的。该错误在CHOLMOD / Demo / cholmod_l_demo脚本中未发生,这表明我的实现存在问题。但是,我在实现中没有做任何更改。有谁知道cudaMemGetInfo()为什么会报告0个可用字节?我认为这个问题的答案将有助于引导我找到解决方案。
我查阅了我的无人值守的升级历史记录,似乎在我开始看到错误的那段时间,我更新了一些linux-header和nvidia驱动程序。但是我不确定nvidia驱动程序的更新是否值得指责,因为CHOLMOD / Demo / cholmod_l_demo可以正常工作。所以我怀疑这可能是Linux标头问题...
我的实现分散在多个文件中,因此可能值得研究Github commit。但是正如我提到的,与过去几个月中CHOLMOD gpu加速工作时相比,我没有更改任何源文件。
任何建议,不胜感激!
最佳答案
cudaMemGetInfo()报告0个空闲字节的原因是因为我的程序在libcublas和libcudart上没有可执行特权。一旦我在程序前加上“ sudo”,就会使用GPU,并且CHOLMOD会像几周前一样工作。
我不确定内核是否更改了特权,或者某些.so安装是否需要新特权。这有点神秘。但是解决方案是使用“ sudo”运行程序。