相关文章推荐
谦和的豌豆  ·  Python 将时间戳转换为日期 - 王舰 ...·  7 月前    · 
踢足球的小熊猫  ·  深入解析VB.NET ...·  1 年前    · 
大方的烤面包  ·  大模型词表扩充必备工具SentencePie ...·  1 年前    · 
大鼻子的小虾米  ·  js ...·  1 年前    · 
爱笑的草稿本  ·  URL中关于空格的编码转换成+或转换成%20 ...·  1 年前    · 
小百科  ›  在cuda中使用静态锁定内存时,全局设备内存大小限制开发者社区
安静的匕首
10 月前
首页
学习
活动
专区
工具
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,
 
推荐文章
谦和的豌豆  ·  Python 将时间戳转换为日期 - 王舰 - 博客园
7 月前
踢足球的小熊猫  ·  深入解析VB.NET Print函数大全-vb.net print方法
1 年前
大方的烤面包  ·  大模型词表扩充必备工具SentencePiece - 掘金
1 年前
大鼻子的小虾米  ·  js 判断是数组还是对象还是字符串,判断字符串是否为空-阿里云开发者社区
1 年前
爱笑的草稿本  ·  URL中关于空格的编码转换成+或转换成%20的问题 - SupLuo - 简书
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
小百科 - 百科知识指南
© 2024 ~ 沪ICP备11025650号