我正在使用带有 CUDA 8.0 的 JCuda 版本 0.8.0RC 在 GTX1080 GPU 上进行矩阵乘法。我将两个矩阵 A 和 B 以行主向量形式加载到设备中,并从设备中读取乘积矩阵。但我发现我的设备内存比我预期的要早用完。例如,如果矩阵 A 的尺寸为 100000 * 5000 = 5 亿个条目 = 2GB 的浮点值,则:
cuMemAlloc(MatrixA, 100000 * 5000 * Sizeof.FLOAT);
工作正常。但是,如果我将行数或行数从 100000 增加到 110000,则在此调用中会出现以下错误(这是在矩阵 B 和 C 的内存分配之前发生的,因此这些不是问题的一部分):
Exception in thread "main" jcuda.CudaException: CUDA_ERROR_OUT_OF_MEMORY
at jcuda.driver.JCudaDriver.checkResult(JCudaDriver.java:344)
at jcuda.driver.JCudaDriver.cuMemAlloc(JCudaDriver.java:3714)
at JCudaMatrixMultiply.main(JCudaMatrixMultiply.java:84) (my code)
问题是在设备上分配这种大小的矩阵应该只需要大约 2.2GB,而 GTX1080 有 8GB 内存,所以我不明白为什么我的内存不足。有人对此有任何想法吗?确实,我将 JCuda 0.8.0RC 与 CUDA 8 的发布版本一起使用,但我尝试下载 CUDA 8 (8.0.27) 的 RC 版本以与 JCuda 0.8.0RC 一起使用,但在使其工作时遇到了一些问题. 但是,如果版本兼容性可能是问题,我可以再试一次。
当然,100000 * 5000 的矩阵非常大,在我的神经网络项目中我暂时不需要使用更大的矩阵,但我想确信我可以在这个新的上使用所有 8GB 内存卡片。谢谢你的帮助。