You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fortran调用cuSparse实现BiCGStab遇CUSPARSE_INTERNAL_ERROR求助

cuSparse *_analysis系列函数触发内部错误,BiCGStab实现失败求助

之前我因为提问不符合调试规范被标记为离题,现在按照要求整理了完整信息来寻求帮助:

问题概述

我正在尝试用cuSparse实现BiCGStab迭代求解器,但两次实现尝试都失败了,错误均来自cuSparse的*_analysis系列函数(比如cusparseSpMV_analysis这类),触发了内部错误。我已经精简了代码,去掉了错误发生后的所有无关逻辑,只保留了能复现问题的核心部分。

具体错误表现

调用*_analysis函数时,程序直接抛出内部错误,没有明确的错误码说明具体原因,导致无法定位问题根源。

最简可复现代码

尝试1:基于CSR格式的BiCGStab初始化

#include <cusparse.h>
#include <cuda_runtime.h>

int main() {
    cusparseHandle_t handle;
    cusparseCreate(&handle);

    // 简化的CSR矩阵参数(实际是符合格式的测试矩阵)
    int m = 100, n = 100, nnz = 300;
    int *d_csrRowPtr, *d_csrColInd;
    float *d_csrVal, *d_x, *d_b;
    cudaMalloc(&d_csrRowPtr, (m+1)*sizeof(int));
    cudaMalloc(&d_csrColInd, nnz*sizeof(int));
    cudaMalloc(&d_csrVal, nnz*sizeof(float));
    cudaMalloc(&d_x, n*sizeof(float));
    cudaMalloc(&d_b, m*sizeof(float));

    // 填充测试数据(省略具体填充逻辑,确保格式合法)
    // ...

    cusparseSpMatDescr_t mat;
    cusparseCreateCsr(&mat, m, n, nnz, d_csrRowPtr, d_csrColInd, d_csrVal,
                      CUSPARSE_INDEX_32I, CUSPARSE_INDEX_32I,
                      CUSPARSE_INDEX_BASE_ZERO, CUDA_R_32F);

    cusparseDnVecDescr_t vec_x, vec_b;
    cusparseCreateDnVec(&vec_x, n, d_x, CUDA_R_32F);
    cusparseCreateDnVec(&vec_b, m, d_b, CUDA_R_32F);

    // 触发错误的分析函数调用
    cusparseSpMVDescr_t spmv_descr;
    cusparseSpMV_createDescr(&spmv_descr);
    cusparseStatus_t status = cusparseSpMV_analysis(handle, CUSPARSE_OPERATION_NON_TRANSPOSE,
                                                    &(float){1.0f}, mat, vec_x, &(float){0.0f}, vec_b,
                                                    CUDA_R_32F, CUSPARSE_SPMV_ALG_DEFAULT, spmv_descr);

    if (status != CUSPARSE_STATUS_SUCCESS) {
        printf("cusparseSpMV_analysis failed with status: %d\n", status);
        // 实际运行时触发内部错误,程序崩溃
    }

    // 资源释放(省略,因为错误发生在分析阶段)
    return 0;
}

尝试2:基于ELL格式的BiCGStab初始化

// 类似结构,只是矩阵格式换成ELL
cusparseCreateEll(&mat, m, n, nnz, d_ellColInd, d_ellVal,
                  max_cols_per_row, CUSPARSE_INDEX_32I,
                  CUSPARSE_INDEX_BASE_ZERO, CUDA_R_32F);
// 同样调用cusparseSpMV_analysis时触发内部错误

我已经做的事情

  1. 验证了输入矩阵的格式合法性:CSR/ELL的行指针、列索引、数值数组都符合cuSparse的要求,没有越界或非法值。
  2. 精简了代码,去掉了所有错误发生后的迭代逻辑,确保问题只出在*_analysis函数调用阶段。
  3. 尝试更换了不同的cuSparse版本(11.7和12.0),问题依然存在。

希望有熟悉cuSparse的开发者能帮我定位这个内部错误的原因,或者指出我在使用*_analysis函数时可能忽略的细节。

内容的提问来源于stack exchange,提问作者Guy P.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:09:46