相关文章推荐
八块腹肌的酱牛肉  ·  Search Page 1/15: ...·  2 月前    · 
聪明的鞭炮  ·  实验室发布智能化工大模型-辽宁滨海实验室·  11 月前    · 
威武的菠菜  ·  metc治疗效果_39健康网·  1 年前    · 
文质彬彬的红金鱼  ·  广场舞网盘资源 - 百度·  1 年前    · 
逼格高的橙子  ·  SPSS工具:时间序列分析---商业销量预测 ...·  1 年前    · 
Code  ›  在cuda中使用静态锁定内存时,全局设备内存大小限制开发者社区
https://cloud.tencent.com/developer/ask/sof/113339022
安静的匕首
2 年前
首页
学习
活动
专区
工具
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,
 
推荐文章
八块腹肌的酱牛肉  ·  Search Page 1/15: Neoster Global Inc Reviews
2 月前
聪明的鞭炮  ·  实验室发布智能化工大模型-辽宁滨海实验室
11 月前
威武的菠菜  ·  metc治疗效果_39健康网
1 年前
文质彬彬的红金鱼  ·  广场舞网盘资源 - 百度
1 年前
逼格高的橙子  ·  SPSS工具:时间序列分析---商业销量预测_spss销售分析-CSDN博客
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号