为了避免真正冗长和不连贯的函数,我从内核中调用了许多设备函数。我在内核调用开始时分配了一个共享缓冲区(每个线程块),并将指向它的指针传递给在内核中执行某些处理步骤的所有设备函数。
我想知道以下几点:
如果我在全局函数中分配共享内存缓冲区,我传递指针的其他设备函数如何区分指针可以引用的可能地址类型(全局设备或共享内存)。
请注意,根据“CUDA 编程指南”使用共享修饰符装饰形参是无效的。imhoit 可以实施的唯一方法是
a) 通过在分配的内存上放置标记 b) 通过调用传递不可见的参数。c) 有一个虚拟的统一地址空间,它有单独的全局和共享内存段,并且可以使用对指针的阈值检查?
所以我的问题是:我是否需要担心它,或者如果不将所有函数内联到主内核中,应该如何进行?
==================================================== ==========================================
另一方面,我今天感到震惊的是,带有 CUDA Toolkit 3.0 的 NVCC 不允许所谓的“来自全局函数的外部调用”,需要内联它们。这意味着实际上我必须内联声明所有设备功能,并且头文件/源文件的分离被破坏。这当然很丑陋,但是还有其他选择吗?