CUDA寄存器资源测试实验

CUDA寄存器资源测试实验

前言

最近在编码中发现了错误:an illegal memory access was encountered.
在我过度使用new出的全局内存时。
首先:该错误产生的原因是内存越界或多个内存请求访问同一内存。为此我做实验验证产生此错误原因是一个块所能申请的全局内存是有限的:
设备:GTX1050Ti

实验代码

/*
*  
*
*   by jieeeeeeeeeeeeee
*/


#include 
#define safeCall(err)       __safeCall(err, __FILE__, __LINE__)
inline void __safeCall(cudaError err, const char *file, const int line)
{
  if (cudaSuccess != err) {
    fprintf(stderr, "safeCall() Runtime API error in file <%s>, line %i : %s.\n", file, line, cudaGetErrorString(err));
    exit(-1);
  }
}

__global__ void kerenl(){
    int size = 6.4*1024/sizeof(float);
    float* a = new float[size];
    for(int i = 0;iprintf("a: %f \n",a[100]);
}


int main(){

    kerenl<<<1,1024>>>();

    safeCall( cudaGetLastError() );
    safeCall(cudaDeviceSynchronize());
    return 0;
}

当 int size = 6.5*1024/sizeof(float); 且 kerenl<<<1,1024>>>();时
产生错误:an illegal memory access was encountered.

当 int size = 6.4*1024/sizeof(float); 且 kerenl<<<1,1024>>>();时
正确执行。

增加gird数量到2即:kerenl<<2,1024>>>();

当 int size = 2.5*1024/sizeof(float); 且 kerenl<<<2,1024>>>();时
产生错误:an illegal memory access was encountered.

当 int size = 2.1*1024/sizeof(float); 且 kerenl<<<2,1024>>>();时
正确执行。

结论

  • 由于没有释放内存,所以总的一个块内最多申请的全局内存资源可能是6.4×1024×1024(6.4MB)。
  • new的全局内存过多会导致程序错误

解决方案

  • 可以用本地内存做临时内存去存储需要的内存

你可能感兴趣的:(CUDA)