相关文章推荐
健壮的大熊猫  ·  MATLAB/Simulink学习笔记(六) ...·  5 月前    · 
贪玩的紫菜  ·  B细胞靶向治疗风湿免疫病怎么用?|风免大咖云 ...·  2 年前    · 
骑白马的鼠标垫  ·  现在最网红的四行仓库为什么叫四行仓库?四行又 ...·  2 年前    · 
酒量小的充电器  ·  施辉:美日中养老保险三支柱比较·  2 年前    · 
博学的钢笔  ·  无间行者之生死潜行迅雷下载_无间行者之生死潜 ...·  2 年前    · 
Code  ›  在cuda中使用静态锁定内存时,全局设备内存大小限制开发者社区
https://cloud.tencent.com/developer/ask/sof/113339022
安静的匕首
1 年前
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
提问

问 在cuda中使用静态锁定内存时,全局设备内存大小限制

Stack Overflow用户
提问于 2016-06-15 09:20:48
EN

我认为全局内存的最大大小应该仅受GPU设备的限制,无论是静态地使用 __device__ __manged__ 分配还是动态地使用 cudaMalloc 。

但是我发现,如果使用 __device__ manged__ 方式,我可以声明的最大数组大小要比GPU设备的限制小得多。

最低限度的工作示例如下:

代码语言: javascript
复制
#include <stdio.h>
#include <cuda_runtime.h>
#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);
#define MX 64
#define MY 64
#define MZ 64
#define NX 64
#define NY 64
#define M (MX * MY * MZ)
__device__ __managed__ float A[NY][NX][M];
__device__ __managed__ float B[NY][NX][M];
__global__ void swapAB()
    int tid = blockIdx.x * blockDim.x + threadIdx.x;
    for(int j = 0; j < NY; j++)
        for(int i = 0; i < NX; i++)
            A[j][i][tid] = B[j][i][tid];
int main()
    swapAB<<<M/256,256>>>();
    gpuErrchk( cudaPeekAtLastError() );
    gpuErrchk( cudaDeviceSynchronize() );
    return 0;
}

它使用 64 ^5 * 2 * 4 / 2^30 GB = 8 GB 全局内存,我将在有12 on全局内存的Nvidia Telsa K40c GPU上运行编译和运行它。

编译器cmd:

代码语言: javascript
复制
nvcc test.cu -gencode arch=compute_30,code=sm_30

输出警告:

代码语言: javascript
复制
warning: overflow in implicit constant conversion.

当我运行生成的可执行文件时,会出现一个错误:

代码语言: javascript
复制
GPUassert: an illegal memory access was encountered test.cu

令人惊讶的是,如果我通过 cudaMalloc API使用相同大小(8GB)的动态分配的全局内存,就不会出现编译警告和运行时错误。

我想知道在CUDA中静态全局设备内存的可分配大小是否有任何特殊的限制。

谢谢!

PS: OS和CUDA: CentOS 6.5 x64,CUDA-7.5.

1 1.6K 0 票数 3
EN
memory
cuda

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-15 09:57:28

这似乎是CUDA运行时API的一个限制。根本原因是这一功能(在数据自动化系统7.5中):

代码语言: javascript
复制
__cudaRegisterVar(
        void **fatCubinHandle,
        char  *hostVar,
        char  *deviceAddress,
  const char  *deviceName,
 
推荐文章
健壮的大熊猫  ·  MATLAB/Simulink学习笔记(六)——三相桥式PWM逆变电路_simulink中三相桥式逆变在哪里-CSDN博客
5 月前
贪玩的紫菜  ·  B细胞靶向治疗风湿免疫病怎么用?|风免大咖云讲堂_腾讯新闻
2 年前
骑白马的鼠标垫  ·  现在最网红的四行仓库为什么叫四行仓库?四行又是哪四行?|金城银行|中南银行|交通银行|北四行_网易订阅
2 年前
酒量小的充电器  ·  施辉:美日中养老保险三支柱比较
2 年前
博学的钢笔  ·  无间行者之生死潜行迅雷下载_无间行者之生死潜行720P_无间行者之生死潜行1080P_迅雷电影天堂
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号