0

语言设计者是否有理由不使指针类型更强,以便编译器可以区分 GPU 指针和 CPU 指针并消除混合两者的可笑常见错误?

是否需要一个指针同时引用 GPU 内存位置和 CPU 内存位置这甚至可能)

或者这只是语言设计中令人难以置信的明显疏忽?


[编辑]示例:C++/CLI 有两种不同类型的指针,不能混用。他们引入了单独的符号,以便编译器可以强制执行此要求:

int* a; //Normal pointer
int^ b; //Managed pointer
//pretend a is assigned here
b = a;  //Compiler error!

有没有理由(除了懒惰/疏忽) CUDA 不做同样的事情?

4

2 回答 2

4

Nvidia 的nvccCUDA C“编译器”不是一个完整的编译器,而是一个相当简单的驱动程序,它调用一些其他工具(cudafe和 C 预处理器)来分离主机和设备代码,并将它们提供给各自的编译器。

Nvidia仅提供设备代码编译器(ciccnvopencc在以前的 CUDA 版本中)。代码的宿主部分只是传递给宿主本机 C 编译器,这使 Nvidia 从提供竞争编译器本身的负担中解放出来。

在指针使用不当时生成错误消息需要解析主机 C 代码。虽然这当然是可能的(例如教授CUDA 特性sparseclang关于 CUDA 的特性),但据我所知,到目前为止还没有人为此投入精力。

Nvidia 已在 NVIDIA CUDA Compiler Driver NVCC 上编写了一份文档,其中更详细地解释了编译过程和所涉及的工具。

于 2013-02-22T22:30:32.377 回答
-2

您定义的所有指针都存储在 RAM 中。不管是GPU指针还是CPU指针。那么您必须自己将其复制到GPU。没有 GPU 也没有 CPU 指针。它只是一个变量,用于保存内存中某个位置的地址。在哪里使用它很重要,如果您在 GPU 中使用它,那么 GPU 将在其可访问的内存中搜索该地址,如果您已将其固定到图形内存,它可以是 RAM 中的一个位置。

最重要的是您无法直接访问 RAM 中的某个位置,因为 CPU 中的地址空间是虚拟的。您的数据可能存储在硬盘上,但在 GPU 上并非如此。您的内存地址是直接传递到该位置。这使得无法统一两个地址空间。

于 2013-02-22T12:01:52.273 回答