为了避免我正在呼唤的真正漫长而不连贯的功能 内核中的许多设备函数。我分配了一个共享 内核调用开始时的缓冲区(每个线程块) 并将指针传递给所有设备函数 在内核中执行一些处理步骤。
我想知道以下事项:
如果我在全局功能中分配共享内存缓冲区 我传递指针的其他设备功能如何区分 在可能的地址类型(全局设备或共享内存)之间 指针可以引用。
请注意,使用共享修饰符修饰形式参数无效 根据'CUDA编程指南'。唯一可能的方式就是 实施是
a)在已分配的内存上放置标记 b)通过调用传递不可见的参数。 c)具有虚拟统一地址空间,该空间具有单独的段 可以使用全局和共享内存以及指针的阈值检查吗?
所以我的问题是:我是否需要担心它或者应该如何进行交替 没有将所有函数内联到主内核中?
=============================================== ============================================
就我今天感到震惊的是,NVCC与CUDA Toolkit 3.0不允许所谓的 '来自全局函数的外部调用',要求它们被内联。这意味着有效 我必须内联声明所有 设备 函数以及标题/来源的分离 文件坏了。这当然很丑陋,但有其他选择吗?
答案 0 :(得分:1)
如果我在全局函数中分配共享内存缓冲区,那么我传递指针的其他设备函数如何区分指针可能引用的可能的地址类型(全局设备或共享内存)。
请注意,在CUDA的上下文中,“共享”内存特指的是块中所有线程之间共享的片上内存。因此,如果您的意思是使用__shared__
限定符声明的数组,通常使用它在设备函数之间传递信息是没有意义的(因为所有线程都看到相同的内存)。我认为编译器可能将常规数组放在共享内存中?或者它可能在寄存器文件中。无论如何,它很有可能最终存在于全局内存中,这将是在设备功能之间传递信息的低效方式(特别是在< 2.0设备上)。
就我今天感到震惊的是,NVCC与CUDA Toolkit 3.0不允许所谓的“全局函数的外部调用”,要求它们被内联。这意味着实际上我必须声明所有设备函数内联并且标题/源文件的分离被破坏。这当然很丑陋,但有其他选择吗?
CUDA不包含设备代码的链接器,因此您必须将内核和所有相关设备功能保存在同一.cu文件中。
答案 1 :(得分:0)
这取决于您的CUDA设备的计算能力。对于计算能力<2.0的设备,编译器必须在编译时决定指针是指向共享存储器还是全局存储器并发出单独的指令。对于计算能力> = 2.0的设备,这不是必需的。
默认情况下,内核中的所有函数调用都是内联的,然后编译器可以在大多数情况下使用流分析来查看某些内容是共享的还是全局的。如果您正在为计算能力<2.0的设备进行编译,则可能遇到警告warning : Cannot tell what pointer points to, assuming global memory space
。当编译器无法正确地遵循您的指针时,这就是您所获得的。