省流:cudaSetDevice和cudaDeviceReset可能导致不可控的memory leak
解决方案:Adding cudaDeviceSynchronize()
after cudaSetDevice
and before cublasCreate()。
今天测试了一个刚写好的包含cuda的代码。大致流程是 cudaSetDevice, cudaDeviceReset初始化-> CPU读取文件 -> cuda相关代码运行 -> ...
然后遇到了一个百思不得七姐的问题。
我CPU读取文件的代码就一个function,单独测试的时候怎么都没问题,在这个cuda里运行的时候就会出很奇怪的bug。因为是纯cpu代码,单独测试的时候是g++编译,cuda是nvcc编译,我首先是怀疑编译器的问题,还考虑-O2开关的问题,但并没发现什么问题。
然后我调整了代码的位置,把cpu读文件的函数放在最最最前面,成功通过。然后慢慢换位置,发现是cudaSetDevice和cudaDeviceReset导致的,这两个calling我尝试只保留其中的一个,也依然导致bug。只有全部注释掉,CPU代码才能正常运行。然后StackOverflow上发现了同样的问题:cuda - cudaDeviceReset causes memory leak? - Stack Overflow
所以咱就是说,有没有家人遇到类似的问题,是别人猜测的cuda这两个函数导致的memory leak的问题吗?
我的环境:
Ryzen7 5800H, RTX3060 laptop
Ubuntu Linux 20.04 on WSL2 Windows 11
gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)
Cuda compilation tools, release 11.5, V11.5.119