在Julia中使用CUDA无法创建简单CuSparseMatrixCOO求助
问题描述
尝试使用CUSPARSE库构建COO矩阵,参考官方文档及CUDA.jl的函数参数定义,创建时传入行索引、列索引、元素值及矩阵维度,运行以下代码时触发越界错误:
using CUDA, SparseArrays K_rows = [0, 1, 1, 2] K_cols = [0, 0, 2, 1] K_vals = [10.0, 20.0, 30.0, 40.0] a = CUDA.CUSPARSE.CuSparseMatrixCOO{Float64,Int64}( CuArray(K_rows), CuArray(K_cols), CuArray(K_vals), (3,3) ) display(a)
错误信息:
ERROR: LoadError: BoundsError: attempt to access 4-element CuArray{Float64, 1, CUDA.DeviceMemory} at index [[4294967297, 8589934596, 1, 1]]
当前Julia版本为1.11.1,请问忽略了什么细节?
问题原因与解决方法
索引格式不匹配:CUDA.jl的
CuSparseMatrixCOO要求行、列索引使用**1-based(从1开始)**格式,你传入的是0-based(从0开始)的索引值。CUSPARSE底层虽支持0-based,但CUDA.jl的构造接口默认处理1-based索引,0-based值会被错误解析为超大溢出数值(比如0会转成4294967297),进而触发越界错误。修复代码:将行、列索引转换为1-based格式:
using CUDA, SparseArrays K_rows = [1, 2, 2, 3] # 原0-based索引+1 K_cols = [1, 1, 3, 2] K_vals = [10.0, 20.0, 30.0, 40.0] a = CUDA.CUSPARSE.CuSparseMatrixCOO{Float64,Int64}( CuArray(K_rows), CuArray(K_cols), CuArray(K_vals), (3,3) ) display(a)
也可以用更简洁的方式:先创建CPU端的SparseMatrixCOO再转换到GPU:
using CUDA, SparseArrays cpu_coo = SparseMatrixCOO((3,3), K_rows .+ 1, K_cols .+ 1, K_vals) gpu_coo = CuSparseMatrixCOO(cpu_coo) display(gpu_coo)
内容的提问来源于stack exchange,提问作者João Schmidt
相关产品推荐
相关产品推荐

