Function CUDA共享内存地址空间与全局内存

Function CUDA共享内存地址空间与全局内存,function,cuda,shared-memory,address-space,Function,Cuda,Shared Memory,Address Space,为了避免我调用的函数太长且不连贯 内核中的许多设备函数。我分配一个共享的 内核调用开始时的缓冲区(每个线程块) 并将指向它的指针传递给所有可用的设备函数 在内核中执行一些处理步骤 我想知道以下几点: 如果我在全局函数中分配共享内存缓冲区 我传递指针的其他设备函数如何区分 在可能的地址类型(全局设备或共享mem)之间 指针可以引用 注意:用共享的修饰符修饰形式参数是无效的 根据“CUDA编程指南”。唯一的办法就是 实施的是 a) 通过在分配的内存上放置标记 b) 通过调用传递不可见的参数。 c)

为了避免我调用的函数太长且不连贯 内核中的许多设备函数。我分配一个共享的 内核调用开始时的缓冲区(每个线程块) 并将指向它的指针传递给所有可用的设备函数 在内核中执行一些处理步骤

我想知道以下几点:

如果我在全局函数中分配共享内存缓冲区 我传递指针的其他设备函数如何区分 在可能的地址类型(全局设备或共享mem)之间 指针可以引用

注意:用共享的修饰符修饰形式参数是无效的 根据“CUDA编程指南”。唯一的办法就是 实施的是

a) 通过在分配的内存上放置标记 b) 通过调用传递不可见的参数。 c) 有一个虚拟的统一地址空间,它有单独的地址段 是否可以使用全局和共享内存以及指针的阈值检查

所以我的问题是:我需要担心吗?或者应该如何进行 没有将所有函数内联到主内核中

===========================================================================================

在这方面,我今天感到震惊的是,使用CUDA Toolkit 3.0的NVCC不允许所谓的 “来自全局函数的外部调用”,要求它们内联。这实际上意味着 我必须内联声明所有设备函数以及头/源的分离
文件坏了。这当然很难看,但还有其他选择吗?

这取决于CUDA设备的计算能力。对于计算能力=2.0的设备

默认情况下,内核中的所有函数调用都是内联的,在大多数情况下,编译器可以使用流分析来查看是共享的还是全局的。如果您正在为具有计算能力的设备进行编译 如果我在全局函数中分配共享内存缓冲区,那么我传递指针的其他设备函数如何区分指针可能引用的可能地址类型(全局设备或共享内存)

请注意,“共享”内存在CUDA上下文中具体指在块中的所有线程之间共享的片上内存。因此,如果您指的是使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我想编译器可能会把规则数组放在共享内存中?或者可能是在注册文件里。无论如何,它很有可能最终被存储在全局内存中,这将是一种在设备功能之间传递信息的低效方式(尤其是在<2.0设备上)

另一方面,我今天感到震惊的是,使用CUDA Toolkit 3.0的NVCC不允许所谓的“来自全局函数的外部调用”,要求它们内联。这意味着实际上我必须内联声明所有设备函数,并且头文件/源文件的分离被打破。这当然很难看,但还有其他选择吗


CUDA不包含用于设备代码的链接器,因此您必须将内核和所有相关设备函数保存在同一个.cu文件中。

编译器曾经发出::'警告:无法判断指针指向的是什么,假设全局内存空间“给出了一个强有力的指示,它无法通过流分析确定指针是指向全局内存还是共享内存。那么,问题是为什么它不允许我对形式参数进行注释。程序员应该在编译时知道指针应该指向哪个区域[使用共享或全局设备内存是您可以在CUDA中做出的最重要的“设计”决策之一]。。问题是,这些知识无法沿着功能屏障保存。请注意,正如人们可能期望的那样,将转换为(共享)与转换为(const)进行类比——我知道这种类比并不完美——不起作用。。编译器抱怨在此上下文中不允许使用“shared”。我使用标志--generate code-arch=compute\u 20,code=sm\u 20进行编译,因此应该是安全的。尽管如此,我还是很惊讶为什么没有选择简单的方法,而是进行跨功能流程分析。我认为这首先会产生内联的需求…@MatthiasHueser:尝试使用
-arch=sm_20
@MatthiasHueser:我不认为编译到>=2.0时会出现“无法判断指针指向什么”的警告。您是否也继承了编译为1.0的项目默认值?如果是这样,您的代码将针对每个体系结构编译一次,警告来自1.0 compile。是的,块中的所有线程都会看到相同的内存,但是如果我没有传递指向设备函数的指针(每个函数也由exec.configuration中的所有线程执行),我将无法引用共享内存[全局函数中声明的数组不在作用域中]。由于全局内核的作用域在执行设备函数时应仍然打开,指针应保持有效。。参考指南指出,分配的共享内存在声明时的内核执行期间保持有效。我现在怀疑NVIDIA是否有意让用户向共享内存传递指针内存在周围。为了澄清,我只传递指向共享内存变量的基指针,而不是任何数据。在不同块上执行的线程将把指向它们的块的基指针共享内存缓冲区传递给函数,然后继续内联执行…@MatthiasHueser:我传递指向共享/全局数据的指针一直以来,编译器很少抱怨(因为计算能力<2.0),最重要的是,一切正常。@MatthiasHueser:你在做什么