【问题标题】:Limits on the cuSparse tridiagonal solver?cuSparse 三对角求解器的限制?
【发布时间】:2018-05-01 13:14:13
【问题描述】:

我决定将我的一个序列号重写为 CUDA。大部分代码是为不同的右手边反转一个大的三对角矩阵。然后我从 cuSparse 库中遇到了cusparseSgtsv。我有一个适用于小矩阵的示例代码,但是当矩阵大小超过 1024 时,除了 nan 什么都没有。我是否遗漏了文档中的某些内容?

这里是示例代码。对于N=1024,代码工作正常。对于N=1025,一直是nan

#include<iostream>                                                                                                                              
#include<cuda_runtime.h>                                                                                                                        
#include<cusparse_v2.h>                                                                                                                         

using namespace std;

__global__ void assignMat(float *a,float *b,float *c,float *r)
{                                                             
    int tid=threadIdx.x+blockDim.x*blockIdx.x;            

    a[tid]=0;
    b[tid]=1;
    c[tid]=0;
    r[tid]=tid;
}

int main()
{
    float *d_a,*d_b,*d_c,*d_r;
    float *h_r;
    int N=1025;
    cusparseStatus_t status;
    cusparseHandle_t handle=0;

    status=cusparseCreate(&handle);

    h_r=(float *)malloc(N*sizeof(float));
    cudaMalloc((void **)&d_a,N*sizeof(float));
    cudaMalloc((void **)&d_b,N*sizeof(float));
    cudaMalloc((void **)&d_c,N*sizeof(float));
    cudaMalloc((void **)&d_r,N*sizeof(float));

    assignMat<<<1,N>>>(d_a,d_b,d_c,d_r);
    status=cusparseSgtsv(handle,N,1,d_a,d_b,d_c,d_r,N);
    if (status != CUSPARSE_STATUS_SUCCESS)
    {
            cout << status << endl;
    }
    else
    {
            cudaMemcpy(h_r,d_r,N*sizeof(float),cudaMemcpyDeviceToHost);
            for (int i=0;i<N;i++)
                    cout << i << " " << h_r[i] << endl;
    }

    free(h_r);
    cudaFree(d_a);cudaFree(d_b);cudaFree(d_c);cudaFree(d_r);
}

【问题讨论】:

    标签: cuda matrix-inverse


    【解决方案1】:

    我是否遗漏了文档中的某些内容?

    不在 cuSparse 文档中,没有。

    但是,每个块的线程数存在硬性限制,因此一旦 N > 1024,您的 assignMat 内核就会停止工作。您可以阅读有关如何选择合法内核启动参数 here 的信息。如果您的代码包含 error checking 或者您使用 cuda-memcheck 运行程序,您可能能够在运行时自己检测到问题。

    【讨论】:

    • 是的,当然。有时最简单的事情让我们(或者我反正)绊倒了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 2019-09-21
    • 2013-09-07
    相关资源
    最近更新 更多