相关文章推荐
斯文的刺猬  ·  python计算图像的饱和度_mob649e ...·  1 年前    · 
旅行中的闹钟  ·  数据类型转换大全(js)【转载】 | 微信开放社区·  2 年前    · 
重情义的卤蛋  ·  Android 11 功能和 API : ...·  2 年前    · 
大方的香烟  ·  使用 Jensen–Shannon ...·  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,
 
推荐文章
斯文的刺猬  ·  python计算图像的饱和度_mob649e815b1a71的技术博客_51CTO博客
1 年前
旅行中的闹钟  ·  数据类型转换大全(js)【转载】 | 微信开放社区
2 年前
重情义的卤蛋  ·  Android 11 功能和 API : 面向企业的 Android 新功能_mr_sunming的博客-CSDN博客
2 年前
大方的香烟  ·  使用 Jensen–Shannon 散度和图结构分析在高维数据中进行离群值挖掘,Journal of Physics: Complexity - X-MOL
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号