CUDA寄存器资源测试实验

本文通过实验探讨了CUDA中全局内存使用的限制,并发现了一个块所能申请的最大全局内存资源约为6.4MB。当超出此限制时,程序会出现非法内存访问错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CUDA寄存器资源测试实验

前言

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

实验代码

/*
*  
*
*   by jieeeeeeeeeeeeee
*/


#include <stdio.h>
#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;i<size;i++)
        a[i] += i;
    printf("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的全局内存过多会导致程序错误

解决方案

  • 可以用本地内存做临时内存去存储需要的内存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值