在标题中,在cuda程序中,核心参数在内核启动后,在本地内存或GPU的全局内存中驻留在哪里?
例如,在cuda程序的LLVM IR中:
i=c(a, b)
__global__ kernel(int param1):
%0 = alloca int
那么,在这种情况下,%0指向哪里?本地记忆或全局记忆?
另外,我看到有时内核参数被保存并直接在寄存器中使用,而不是将其存储在任何内存中。这个决定是如何做出的?
答案 0 :(得分:4)
罗伯特·科维拉在评论中指出:参数存储在GPU的内存中。
然而,
执行alloca
并将param1存储到已分配的空间会将参数从常量内存复制到本地内存。
alloca
指令被降低到PTX代码中的堆栈分配。
在clang中,这是在代码生成期间处理函数参数的规范方法。但是,在GPU上可以这样做(因为PTX在降低到SASS时优化只是说:可以)导致性能下降,因为本地内存通过所有缓存级别下降到全局内存并且比常量内存慢得多。
在LLVM中,您拥有mem2reg
优化程序通行证。此过程将堆栈上的所有内存分配提升为寄存器。
在内核参数的情况下,您很可能希望进行此优化。 alloca
和store
指令从您的IR中消失,参数将直接使用,而不是不必要的副本。