2016-10-05 59 views
0

我正在使用特斯拉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: an illegal memory access was encountered test2.cu 48

48号线是指

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

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

回答

1

你的第三个内核启动参数应该是m*sizeof(float)。该参数指定字节中共享内存的大小。

+0

是的,这是问题,谢谢! – starrr