首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在cuda中使用静态锁定内存时,全局设备内存大小限制

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

Stack Overflow用户
提问于 2016-06-15 09:20:48
回答 1查看 1.6K关注 0票数 3

我认为全局内存的最大大小应该仅受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.

EN

回答 1

Stack Overflow用户

回答已采纳

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

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

代码语言:javascript
运行
复制
__cudaRegisterVar(
        void **fatCubinHandle,
        char  *hostVar,
        char  *deviceAddress,
  const char  *deviceName,
        int    ext,
        int    size,
        int    constant,
        int    global
);

它只接受任何静态声明的设备变量大小的带符号int。这将限制最大大小为2^31 (2147483648)字节。您所看到的警告是因为CUDA前端发出的样板代码包含对__cudaResgisterVar的调用,如下所示:

代码语言:javascript
运行
复制
__cudaRegisterManagedVariable(__T26, __shadow_var(A,::A), 0, 4294967296, 0, 0);
__cudaRegisterManagedVariable(__T26, __shadow_var(B,::B), 0, 4294967296, 0, 0);

4294967296才是问题的根源。大小将使有符号整数溢出,并导致API调用崩溃。因此,目前似乎每个静态变量的容量限制在2Gb以内。如果NVIDIA对您的应用程序来说是一个严重的问题,我建议您将其作为一个bug来处理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37831246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档