是否有一个原因是语言设计者没有更强类型的指针,因此编译器可以区分GPU指针和CPU指针,并消除混合这两者的可笑的常见错误?
曾经是否需要让指针同时引用GPU内存位置和CPU内存位置(甚至可能)?< / p>
或者这只是对语言设计的一种令人难以置信的明显疏忽?
[编辑] 示例:C ++ / CLI有两种不同类型的指针,不能混用。他们引入了单独的表示法,以便编译器可以强制执行此要求:
int* a; //Normal pointer
int^ b; //Managed pointer
//pretend a is assigned here
b = a; //Compiler error!
有没有理由(懒惰/疏忽除外) CUDA不会做同样的事情?
答案 0 :(得分:4)
Nvidia的nvcc
CUDA C“编译器”不是一个完整的编译器,而是一个相当简单的驱动程序,它调用其他工具(cudafe
和C预处理器)来分离主机和设备代码,将它们提供给各自的编译器。
Nvidia仅提供设备代码编译器(以前的CUDA版本中的cicc
或nvopencc
)。代码的主机部分只是传递给主机本机C编译器,这使得Nvidia免于提供竞争编译器本身的负担。
在使用不正确的指针时生成错误消息需要解析主机C代码。虽然这肯定是可能的(例如sparse
或clang
教授关于CUDA的特点),据我所知,到目前为止,没有人投入这些努力。
Nvidia已经写了document on the NVIDIA CUDA Compiler Driver NVCC来更详细地解释编译过程和涉及的工具。
答案 1 :(得分:-2)
您定义的所有指针都存储在RAM中。无论是GPU指针还是CPU指针。然后你必须自己复制到GPU。没有GPU也没有CPU指针。它只是一个变量,它将地址保存到内存中的某个位置。你使用它的地方很重要,如果你在GPU中使用它,那么GPU将在其可访问的内存中搜索该地址,如果你将它固定在你的图形内存中,它可以是RAM中的一个位置。
最重要的是,您无法直接访问RAM中的某个位置,因为CPU中的地址空间是虚拟的。您的数据可能存储在硬盘驱动器上,但GPU上并非如此。你的记忆地址是直接传递到该位置。这使得无法统一两个地址空间。