cuda复数稀疏矩阵计算

void testSparseComplex()
{
    const int rows = 2;
    const int cols = 3;
    const int nnz = 3;  // 非零元素数量

    // 主机端数据
    std::vector<int> h_rowPtr;
    std::vector<int> h_colInd;
    std::vector<Complex> h_values;
    std::vector<Complex> h_x(cols, make_cuComplex(1.0, 1.0)); // 初始化向量 x
    std::vector<Complex> h_y(rows);

    for (int i = 0; i < cols; ++i) {
        h_x[i] = make_cuComplex(static_cast<float>(i + 1), static_cast<float>(i + 2));
    }

    // 初始化矩阵和向量
    initializeSparseMatrix(h_rowPtr, h_colInd, h_values);

    // 设备端数据指针
    int* d_rowPtr, * d_colInd;
    Complex* d_values, * d_x, * d_y;
    cusparseHandle_t handle;
    cusparseSpMatDescr_t matA;
    cusparseDnVecDescr_t vecX, vecY;

    // 初始化 cuSPARSE 库
    cusparseCreate(&handle);

    // 分配设备内存
    cudaMalloc((void**)&d_rowPtr, h_rowPtr.size() * sizeof(int));
    cudaMalloc((void**)&d_colInd, h_colInd.size() * sizeof(int));
    cudaMalloc((void**)&d_values, h_values.size() * sizeof(Complex));
    cudaMalloc((void**)&d_x, cols * sizeof(Complex));
    cudaMalloc((void**)&d_y, rows * sizeof(Complex));

    // 将数据从主机复制到设备
    cudaMemcpy(d_rowPtr, h_rowPtr.data(), h_rowPtr.size() * sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(d_colInd, h_colInd.data(), h_colInd.size() * sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(d_values, h_values.data(), h_values.size() * sizeof(Complex), cudaMemcpyHostToDevice);
    cudaMemcpy(d_x, h_x.data(), cols * sizeof(Complex), cudaMemcpyHostToDevice);

    // 创建和设置稀疏矩阵描述符
    cusparseCreateCsr(&matA, rows, cols, nnz,
        d_rowPtr, d_colInd, d_values,
        CUSPARSE_INDEX_32I, CUSPARSE_INDEX_32I,
        CUSPARSE_INDEX_BASE_ZERO, CUDA_C_32F);


    // 创建和设置密集向量描述符
    cusparseCreateDnVec(&vecX, cols, d_x, CUDA_C_32F);
    cusparseCreateDnVec(&vecY, rows, d_y, CUDA_C_32F);


    // 执行稀疏矩阵-向量乘法
    Complex alpha = make_cuComplex(1.0, 0.0);
    Complex beta = make_cuComplex(0.0, 0.0);
    size_t bufferSize = 0;
    void* dBuffer = nullptr;


    // 获取临时缓冲区大小
    cusparseSpMV_bufferSize(handle, CUSPARSE_OPERATION_NON_TRANSPOSE,
        &alpha, matA, vecX, &beta, vecY, CUDA_C_32F,
        CUSPARSE_MV_ALG_DEFAULT, &bufferSize);

    // 分配临时缓冲区
    cudaMalloc(&dBuffer, bufferSize);

    // 进行计算
    cusparseSpMV(handle, CUSPARSE_OPERATION_NON_TRANSPOSE,
        &alpha, matA, vecX, &beta, vecY, CUDA_C_32F,
        CUSPARSE_MV_ALG_DEFAULT, dBuffer);

    // 将结果从设备复制到主机
    cudaMemcpy(h_y.data(), d_y, rows * sizeof(Complex), cudaMemcpyDeviceToHost);


    // 打印结果
    for (int i = 0; i < rows; ++i) {
        std::cout << "(" << cuCrealf(h_y[i]) << ", " << cuCimagf(h_y[i]) << ") ";
    }
    std::cout << std::endl;

    // 释放设备内存和 cuSPARSE 库
    cudaFree(d_rowPtr);
    cudaFree(d_colInd);
    cudaFree(d_values);
    cudaFree(d_x);
    cudaFree(d_y);
    cudaFree(dBuffer);
    cusparseDestroySpMat(matA);
    cusparseDestroyDnVec(vecX);
    cusparseDestroyDnVec(vecY);
    cusparseDestroy(handle);

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值