使用共享内存是否会导致此代码出错?
Does use of shared memory cause error in this code?
我使用的是 Tesla 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;
}
在 运行ning 代码之后我得到以下错误:
GPUassert: an illegal memory access was encountered test2.cu 48
第48行指的是
gpuErrchk( cudaMemcpy(bold3, dev_bold3, sizeof(float)*cor_size,
cudaMemcpyDeviceToHost));
我不明白是什么导致了错误,但是当我将 m 的值更改为 50 或更少时,代码可以正常工作,但对于更高的值,它会给我这个错误。这个问题和共享内存的使用有关吗?
你的第三个内核启动参数应该是m*sizeof(float)
。该参数以 字节 .
为单位指定共享内存的大小
我使用的是 Tesla 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;
}
在 运行ning 代码之后我得到以下错误:
GPUassert: an illegal memory access was encountered test2.cu 48
第48行指的是
gpuErrchk( cudaMemcpy(bold3, dev_bold3, sizeof(float)*cor_size, cudaMemcpyDeviceToHost));
我不明白是什么导致了错误,但是当我将 m 的值更改为 50 或更少时,代码可以正常工作,但对于更高的值,它会给我这个错误。这个问题和共享内存的使用有关吗?
你的第三个内核启动参数应该是m*sizeof(float)
。该参数以 字节 .