【问题标题】:My CUDA kernel code is not working我的 CUDA 内核代码不工作
【发布时间】:2015-07-03 18:01:57
【问题描述】:

我尝试编写一个小代码来生成数字并在数组中返回结果,但是一旦我运行此代码它就无法正常工作,我尝试使用 Nsight 调试器来了解我的问题出在哪里,但它立即冻结并关闭。

你能帮我理解这段代码的问题在哪里吗?

__global__ void mykernel( int* PF_tmp, int* PL_tmp, int* QF_tmp, int* QL_tmp, 
                              int m[2], int p[5], int q[5], int i, int* n, 
                              int out[10][5], int N)
    {
        int id = blockDim.x * blockIdx.x + threadIdx.x;

        int idx = blockIdx.x;
        int idy = blockIdx.y;

        int w = idx/100;
        int x = idx%100;
        int y = idy;

        int z = threadIdx.x;

        int len = ((i * 2) + 5);


        // Fill PF_tmp & QF_tmp
        if( i > 0){
            for(int k = 0; k < (i * 2); k++)
            {
                p[k]   = PF_tmp[k];
                q[k]   = QF_tmp[k];
            }
        }

        // Fill X
        if( x > 10)
        {
            p[(i*2)] = (x - (x % 10)) / 10;
            p[(i*2)+1] = x % 10;
        }else{
            p[(i*2)] = 0;
            p[(i*2)+1] = x;
        }

        // Fill Y
        if( y > 10)
        {
            q[(i*2)] = (y - (y % 10)) / 10;
            q[(i*2)+1] = y % 10;
        }else{
            q[(i*2)] = 0;
            q[(i*2)+1] = y;
        }

        // Fill m
        p[(i * 2)+2] = m[0];
        q[(i * 2)+2] = m[1];

        // Fill W 
        if( w > 10)
        {
            p[(i*2)+3] = (w - (w % 10)) / 10;
            p[(i*2)+4] = w % 10;
        }else{
            p[(i*2)+3] = 0;
            p[(i*2)+4] = w;
        }

        // Fill Z 
        if( z > 10)
        {
            q[(i*2)+3] = (z - (z % 10)) / 10;
            q[(i*2)+4] = z % 10;
        }else{
            q[(i*2)+3] = 0;
            q[(i*2)+4] = z;
        }

        // Fill PL_tmp & QL_tmp
        if( i > 0)
        {
            for(int k = 0; k < (i * 2); k++)
            {
                p[(len-(i * 2))+k]   = PL_tmp[k];
                q[(len-(i * 2))+k]   = QL_tmp[k];
            }
        }

        if(id<10)
        {
            for(int k =0; k<5; k++)
                out[id][k] = p[k];
        }

    }



    int main()
    {
        cudaError err;
        dim3 blocks(10000, 100);
        dim3 threads(100); 

        int m[2] = {4,5};
        int hst_out[10][5];
        int p[5];
        int q[5];
        err = cudaMalloc((void **)&p, 5);
        err = cudaMalloc((void **)&q, 5);
        err = cudaMalloc((void **)&hst_out, 50);

        mykernel<<<blocks, threads>>>(NULL, NULL, NULL, NULL, m, p, q, 0, NULL, hst_out, 100000000);

        return 0;
    }

【问题讨论】:

标签: cuda nsight


【解决方案1】:

错误很明显,都是C编程。

当你声明时

诠释 m[2] = {4,5}; int hst_out[10][5]; 诠释 p[5]; 整数q[5];

现在hst_out、p、q都不是指针了,后来被当成指针了:

错误 = cudaMalloc((void **)&p, 5); 错误 = cudaMalloc((void **)&q, 5); 错误 = cudaMalloc((void **)&hst_out, 50);

所以你最初应该将它声明为一个指针,例如,

诠释* p;

并以这种方式使用它:

错误 = cudaMalloc((void **)&p, 5*sizeof(int));

还要注意,您声明的大小只有 5 个字节....而我将其声明为 5*sizeof(int)。

更多示例见:

http://cuda-programming.blogspot.sg/2013/03/how-to-avoid-uses-of-cudamalloc-in.html

【讨论】:

  • 我之前尝试将 p、q、hst_out 声明为指针,但运行后结果相同。我想知道为什么 Nsight 不能使用我的代码!谢谢
  • 不确定你的新代码是什么样子的,也许你想添加为附录?
  • 我想我已经解决了这个问题。它来自我的卡 Cuda 1.1 ,它非常旧,并且 cuda 工具包 6.5 与此版本的 Cuda 不兼容。我会尝试升级卡。谢谢
  • 其实cuda toolkit 6.5可以和cc1.1设备一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2013-12-27
  • 2011-07-04
  • 1970-01-01
相关资源
最近更新 更多