使用共享内存会导致此代码出错吗?

时间:2016-10-05 01:10:50

标签: cuda gpu gpgpu

我使用的是特斯拉k40c gpu。我在其上运行以下代码:

 #define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, const char *file, int line, bool abort=true)
{
   if (code != cudaSuccess)
   {
      fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
      if (abort) exit(code);
   }
}

  __global__ void ker(float * a, float * c,long long cor_size,int n, int m)
    {
    extern __shared__ float cache[];
    cache[threadIdx.x]=4;
    }


    int main()
    {
        int  m =500,n =10000;
        long long cor_size = n-1;
        cor_size *=n;
        cor_size /=2;
        float * dev_bold1,*dev_bold3;
        gpuErrchk(cudaMalloc ((void**)&dev_bold1,sizeof(float)*m*n));
        gpuErrchk(cudaMalloc ((void**)&dev_bold3,sizeof(float)*cor_size));
        float * bold1 = new float [m*n];
        memset(bold1, 0, sizeof(float)*m*n);
        float * bold3 = new float [cor_size];
        memset(bold3, 0, sizeof(float) *cor_size);
        gpuErrchk(cudaMemcpy( dev_bold1, bold1, sizeof(float) * m  * n, cudaMemcpyHostToDevice));
        ker<<<cor_size,m,m>>>(dev_bold1,dev_bold3,cor_size,n,m);
        gpuErrchk( cudaPeekAtLastError() );
        gpuErrchk( cudaMemcpy(bold3, dev_bold3, sizeof(float)*cor_size, cudaMemcpyDeviceToHost));
    return 1;
    }

运行代码后,我收到以下错误:

  

GPUassert:遇到非法内存访问test2.cu 48

第48行指的是

  

gpuErrchk(cudaMemcpy(bold3,dev_bold3,sizeof(float)* cor_size,   cudaMemcpyDeviceToHost));

我不明白导致错误的原因,但是当我将m的值更改为50或更少的代码时,但是对于更高的值,它会给我这个错误。这个问题是否与共享内存的使用有关?

1 个答案:

答案 0 :(得分:1)

您的第三个内核启动参数应为m*sizeof(float)。该参数指定 bytes 中的共享内存大小。