Memory 每个CUDA线程的本地内存量

Memory 每个CUDA线程的本地内存量,memory,cuda,limit,gpu-local-memory,Memory,Cuda,Limit,Gpu Local Memory,我在NVIDIA文档(,表#12)中读到,对于我的GPU(GTX 580,compute capability 2.0),每个线程的本地内存量是512 Ko 我试图用CUDA6.5在Linux上检查这个限制,但没有成功 以下是我使用的代码(其唯一目的是测试本地内存限制,它不会进行任何有用的计算): 汇编正常,报告如下: ptxas info : 0 bytes gmem ptxas info : Compiling entry function '_Z19kernel_test_pr

我在NVIDIA文档(,表#12)中读到,对于我的GPU(GTX 580,compute capability 2.0),每个线程的本地内存量是512 Ko

我试图用CUDA6.5在Linux上检查这个限制,但没有成功

以下是我使用的代码(其唯一目的是测试本地内存限制,它不会进行任何有用的计算):

汇编正常,报告如下:

ptxas info    : 0 bytes gmem
ptxas info    : Compiling entry function '_Z19kernel_test_privatePc' for 'sm_20'
ptxas info    : Function properties for _Z19kernel_test_privatePc
    65000 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info    : Used 21 registers, 40 bytes cmem[0]
在GTX 580上运行时,当我达到每个线程65000字节时,出现了一个“内存不足”错误。以下是控制台中程序的确切输出:

MEMSIZE=65000 bytes.
GPUassert: out of memory cuda_test_private_memory.cu 48
我还使用GTX770GPU(在带有CUDA6.5的Linux上)进行了测试。对于MEMSIZE=200000,它运行时没有错误,但是对于MEMSIZE=250000,在运行时出现了“内存不足错误”


如何解释这种行为?我做错什么了吗

似乎您遇到的不是本地内存限制,而是堆栈大小限制:

ptxas信息:内核测试专用PC的函数属性

65000字节堆栈帧,0字节溢出存储,0字节溢出加载

在本例中,您希望成为本地变量的变量位于(GPU线程)堆栈上

根据@njuffa提供的信息,可用堆栈大小限制为以下较小值:

  • 最大本地内存大小(cc2.x及更高版本为512KB)
  • GPU内存/(#个SMs)/(每个SM的最大线程数)
  • 显然,第一个限制不是问题所在。我假设您有一个“标准”GTX580,它有1.5GB内存和16条短信。cc2.x设备每个多处理器最多有1536个驻留线程。这意味着我们有1536MB/16/1536=1MB/16=65536字节堆栈。总可用内存中会减去一些开销和其他内存使用,因此堆栈大小限制在65536以下,显然在您的情况下介于60000和65000之间


    我怀疑GTX770上的类似计算会产生类似的结果,即最大堆栈大小在200000和250000之间。

    您使用的是哪种CUDA版本?这是linux还是windows?编译代码或运行代码时是否出现“内存不足错误”?(将准确的错误文本粘贴到问题中)编译代码时使用的命令行是什么?我猜您是在为cc2.0之前的体系结构进行编译。如果我为cc1.1体系结构编译这段代码,编译时会出现“内存不足错误”,因为cc1.x设备对每个线程的本地内存限制更小(16KB)。如果我为cc2.0体系结构编译,您的代码会为我正常编译和运行。您的问题也可能是由这行代码引起的:
    char output[MEMSIZE]此(主机代码)创建基于堆栈的分配,这些类型的分配可能会受到平台的限制。将准确的错误文本粘贴到问题中会有所帮助。(您可以编辑自己的问题。)@RobertCrovella感谢您对我的问题感兴趣。我已经编辑了我的问题以添加缺少的信息。cudaGetErrorString()在运行时报告的确切错误文本是“内存不足”。这是一个非常好的问答,几乎可以肯定是cuda程序员(包括我自己)经常遇到的问题。我希望它有更多的能见度!谢谢你的解释。我对GTX770做了同样的计算(4GBRAM,8SMS,每个SM最多2048个线程),得到了262144字节的堆栈大小。这与我在GTX 770上遇到的200000字节到250000字节(更准确地说是242000字节到245000字节)之间的限制是一致的。我还使用malloc()将内核中的静态分配替换为动态分配:这样我就可以分配512ko的本地内存(甚至更多,最多7个月!)。如果您需要比内核
    malloc
    中的内存更多的内存,请查看以提高堆内存分配限制。确定。我认为对
    malloc
    的内核内调用将分配本地内存。现在我了解到内核内
    malloc
    分配全局内存堆,其默认大小为8 Mo。因为内核内
    malloc
    与分配本地内存无关,唯一的方法似乎是在内核中使用静态分配,这受到线程堆栈的限制(在我的GTX 580案例中为65 Ko)。那么,报告中报告的512 Ko“每个线程的本地内存量”适用于什么?
    ptxas info    : 0 bytes gmem
    ptxas info    : Compiling entry function '_Z19kernel_test_privatePc' for 'sm_20'
    ptxas info    : Function properties for _Z19kernel_test_privatePc
        65000 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
    ptxas info    : Used 21 registers, 40 bytes cmem[0]
    
    MEMSIZE=65000 bytes.
    GPUassert: out of memory cuda_test_private_memory.cu 48