Python中修改cusolverDnDgesvdj调用以仅计算奇异值并移除U/V矩阵
cuSOLVER cusolverDnDgesvdj 仅计算奇异值时的正确调用方式
核心问题说明
当jobz设为CUSOLVER_EIG_MODE_NOVECTOR(数值0)仅计算奇异值时,不能直接给d_U、d_V传0或None,CUDA API要求传入合法的空设备指针占位,而非Python层面的空值或数值0。
具体修改步骤
设置正确的jobz参数
确保jobz明确指定为CUSOLVER_EIG_MODE_NOVECTOR(或直接传0),告知库仅计算奇异值,无需生成左/右奇异向量。调整bufferSize调用
即使不需要U、V矩阵,调用cusolverDnDgesvdj_bufferSize时仍需传入空设备指针占位,无需为其分配实际内存。以PyCUDA为例:import pycuda.driver as cuda import cusolver # 创建空设备指针作为占位 d_U = cuda.Pointer() d_V = cuda.Pointer() # 计算buffer大小 status = cusolver.cusolverDnDgesvdj_bufferSize( handle, jobz, m, n, d_A, lda, d_S, d_U, ldu, d_V, ldv, buffer_size, workspace_size )注:CuPy环境下可通过
cupy.cuda.MemoryPointer(cupy.cuda.UnownedMemory(), 0)生成空设备指针。调整实际计算调用
实际调用cusolverDnDgesvdj时,传入上述空占位指针即可,库会因jobz=0跳过对U、V内存的访问:status = cusolver.cusolverDnDgesvdj( handle, jobz, m, n, d_A, lda, d_S, d_U, ldu, d_V, ldv, d_work, buffer_size, d_workspace, workspace_size, devInfo )
错误原因
直接传0或None会导致CUDA API解析指针时识别为无效地址,触发状态错误;而空设备指针(指向设备地址0的合法指针)是符合要求的占位符,库在jobz=0时不会尝试访问其指向的内存。
内容的提问来源于stack exchange,提问作者Vitality
相关产品推荐
相关产品推荐

