CUDAレジスタリソーステスト実験

2896 ワード

CUDAレジスタリソーステスト実験


前言


最近エンコーディングでエラーが見つかりました:an illegal memory access was encountered.newから出たグローバルメモリを使いすぎたとき.まず、このエラーの原因は、メモリが境界を越えているか、複数のメモリ要求が同じメモリにアクセスしているためです.このため、ブロックが申請できるグローバルメモリが限られているため、このエラーが発生したことを実験的に検証しました.デバイス:GTX 1050 Ti

じっけんコード

/*
*  
*
*   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 , line %i : %s.
"
, 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
"
,a[100]); } int main(){ kerenl<<<1,1024>>>(); safeCall( cudaGetLastError() ); safeCall(cudaDeviceSynchronize()); return 0; }

int size=6.5*1024/sizeof(float);そしてkerenl<<11024>>();エラーが発生しました:an illegal memory access was encountered.
int size=6.4*1024/sizeof(float);そしてkerenl<<11024>>();に設定されています.
gird数を2に増やすとkerenl<<21024>>();
int size=2.5*1024/sizeof(float);そしてkerenl<<21024>>();エラーが発生しました:an illegal memory access was encountered.
int size=2.1*1024/sizeof(float);そしてkerenl<<21024>>();に設定されています.

結論

  • メモリが解放されていないため、全体のブロック内で最も多く申請されるグローバルメモリリソースは6.4である可能性がある.×1024×1024(6.4MB).
  • newのグローバルメモリが多すぎるとプログラムエラー
  • になります.

    ソリューション

  • は、必要なメモリ
  • をローカルメモリで一時メモリとして記憶することができる.