Memory 每个CUDA线程的本地内存量
我在NVIDIA文档(,表#12)中读到,对于我的GPU(GTX 580,compute capability 2.0),每个线程的本地内存量是512 Ko 我试图用CUDA6.5在Linux上检查这个限制,但没有成功 以下是我使用的代码(其唯一目的是测试本地内存限制,它不会进行任何有用的计算): 汇编正常,报告如下: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
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提供的信息,可用堆栈大小限制为以下较小值:
我怀疑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