vs2010,cuda4.2使用–ptxas-options=-v选项看储存器使用情况时,编译某下函数时出现以下信息:
1> ptxas info : Compiling entry function ‘Z16d_FillMatrixLSGLPPdS0_P10CRectangleS0_S0_S0_S0’ for ‘sm_21’
1> ptxas info : Function properties for Z16d_FillMatrixLSGLPPdS0_P10CRectangleS0_S0_S0_S0
1> 848 bytes stack frame, 56 bytes spill stores, 80 bytes spill loads
1> ptxas info : Function properties for Z16Get_eu_OnSurface7double2P7double3RdS2_S2
1> 24 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
1> ptxas info : Function properties for _Z5Get_lii
1> 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
。。。。。。
1> ptxas info : Function properties for Z9ReduceSGLiiPdS
1> 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
1> ptxas info : Function properties for _Z9atomicADDPdd
1> 24 bytes stack frame, 20 bytes spill stores, 20 bytes spill loads
。。。。。
1> ptxas info : Function properties for sqrt
1> 0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
1> ptxas info : Used 63 registers, 60 bytes cmem[0], 76 bytes cmem[14]
///////////////////////////////////////////////////////////////////////////////////////////////////////
有以下疑问:
1、 848 bytes stack frame, 56 bytes spill stores, 80 bytes spill loads中三个数据分别表示什么意思
2、是不是stack frame不为0的就表示没有内联成功
3、 Used 63 registers, 60 bytes cmem[0], 76 bytes cmem[14]中,cmem[0]、cmem[14]表示什么, 怎么没显示local memory的信息呢
楼主您好,
(1)stack frame是local memory中的一块区域,用来保存在当前函数的上下文中的不能放入寄存器的局部变量(以及可能的其他信息,NV没有公布ABI, 无法提供更相信的信息了)。注意是当前函数。下文的这个例子:
noinline device int back(…) {int buffer[10]; …}
global void rono(…){…; if (tid == 1) back(…); …}
中的编号为1的线程很可能在将调用back时,建立自己的stack frame, 来存放back里所需要的放入local memory的数据。
(2)spill loads/stores是将寄存器交换到local memory而进行的读写操作(注意你的上文多少字节多少字节是per thread的数据。请注意换算)。
(3)stack frame不为0是否代表内联成功我不知道。理由如上文“NV没有公布ABI,我不知道详细信息“。但__global__函数自己也应该有自己的stack frame的,用来存放局部数据,所以你的推断可能是不对的。
(4)cmem[n]里面的n是指constant cache banks。
根据已有的资料,bank 0(也就是你的cmem[0])一般存放kernel的参数。bank 14(你的cmem[14])可能是一些常量。
换句话说,实际硬件对constant cache的使用,不是作为大块连续的空间的,而是例如c [0xa] [0xb]这种的。其实a是bank编号,b是bank里的偏移量。以及NV没有公布constant cache结构,我也不能知道太多。
感谢您的来访,祝您工作愉快。
[
谢谢版主的回答,网上看到这条命令能查到用了多少local memory(lmem),我上面怎么不显示呢?一般的不加noninlin的函数是不是都是内联的?
楼主您好,关于lmem的显示的问题,我表示不知道。NVIDIA没有官方发布过关于ptxas的资料。请咨询NVIDIA官方支持,看看他们能否说明什么。
以及,对于2.0+的计算能力(1.x总是inline的), noinline/forceinline/无任何修饰,均无法强制编译器作出任何决定。这些只能对编译器暗示,但编译器会自行作出决定,无法强迫。
谢谢版主的回答。
还有一个问题
一段很长程序,想分解成几个函数,但写成函数形式时输入参数很多(比如20个),这会不会影响效率?
这个一般不会影响kernel的执行效率,会轻微影响invoke kernel的速率,不过如果您kernel有一定的计算规模的话,我觉得参数多一些应该影响不大。
大致如上,供您参考。
祝您编码愉快~
block内不会产生分叉的if-else语句是不是也可以认为是不影响效率的?
您好,一般的说法是如果if-else的分支是和warp对齐的,那么基本无需考虑对效率的影响。同时一般习惯上block里线程的数量是warp的整数倍,所以如果此时分支和block对齐,那一定是和warp对齐的,所以此时也不影响效率。
但是,按照一般的block选取方法,block包含多个warp,此时如果要求按照block对齐,实际上是提高了要求,真实情况可以降低到按照warp对齐即可。
大致如上,祝您编码顺利~
在2.0+计算能力上,对__global__的参数访问实际上通过constant cache进行的,基本上您1个参数的kernel和20个参数的kernel, 区别在于:
(1)启动kernel时,constant的固定位置中设置20个数据还是1个数据。(非常细微的开销,基本无区别)
(2)您的kernel访问20个常数还是访问1个常数(依然基本无区别)
综上,基本0影响。
谢谢回答,又长了许多知识
在fermi架构上是不是寄存器用的超过64个了以后就直接将超出的部分放入local memory?还是说有可能会放入48KB的share memory?
[
不会自动进入shared memory的,以及您如果需要知道local memory的使用情况,可以看visual profiler的结果。
以及放入local memory并不限于寄存器用超。
大致如上,手机打字不易,现在3这些吧
我摘抄一段cuda4.0编程指南:
“每个多处理器有一级缓存,所有多处理器共享二级缓存,二者都用于缓存全局或本地的访问,包括临时寄存器溢出。缓存行为(如读是缓存在L1和L2还是只缓存在L2)能够基于访问使用读写指令修饰符部分配置。”
里面有“包括临时寄存器溢出”,这个如何理解?是编译时处理的,还是运行时处理的,如果将48KB的共享内存配置为L1缓存,是不是在临时寄存器溢出的时候会带来性能提升(程序中没有使用共享内存)?
Q:里面有“包括临时寄存器溢出”,这个如何理解?
A:楼主您好,就是在寄存器使用出现紧张的情况下,将寄存器中的内容交换到local memory(global memory的一部分),然后空出寄存器,作为他用。
Q: 是编译时处理的,还是运行时处理的。
A: 楼主您好,是编译时处理的(生成指令)。也是运行时候处理的(执行实际的reigsters spilling)
Q: 如果将48KB的共享内存配置为L1缓存,是不是在临时寄存器溢出的时候会带来性能提升(程序中没有使用共享内存)。
A: 楼主您好。是会带来性能提升的。
请注意不要挖坟,不要在别人的主题下插入你自己的内容。感谢合作。
十分感谢您的回复!
编译时显示信息如下:
1> ptxas : info : 132 bytes gmem, 368 bytes cmem[0], 28 bytes cmem[14] (任务 ID: 19)
1> ptxas : info : Compiling entry function ‘_Z4echoPdS_S_S_S_S_P11gpu_Complex’ for ‘sm_13’ (任务 ID: 19)
1> ptxas : info : Used 126 registers, 44 bytes smem, 120 bytes cmem[1], 180 bytes lmem (任务 ID: 19)
gmem 表示global memory,cmem 表示shared memory ,cmem表示constant memory 对吗?
另外,在程序中还没有自己指定shared memory,怎么显示信息就已经有了呢?
菜鸟刚上手,还很多不懂,麻烦您解答,谢谢!
楼主您好,gmem这个无资料,无法知悉。
cmem[0]和cmem[14]可能是一些参数和kernel中用到的,被放入constant cache的某些bank的参数,这2个依然无资料。
您这里的shared memory应该是“44 bytes smem”, 而不是cmem[bank]。
为何您没有使用shared memory, 这里却显示,这个依然无资料,无法知道(如果不是您使用了却不知道的话)。
仅为ptxas -v输出的信息基本无资料,所以无法为您提供进一步的信息。
(您可以联系NV,询问在您签署了NDA后,能否为您提供精确的资料)。
刚才发现您是sm_13, 这个会导致参数传递用shared memory的。所以你会出现莫名占用。
详见:
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6995&extra=page%3D1&page=2
的14#