1

我有一个在单个 GPU 上工作的代码。在该代码中,我使用了

__device__ uint32_t aaa;

代码开头的这一行在唯一涉及的设备上声明了一个全局变量。

现在我想使用多个设备(两个或更多),但我不知道在这种情况下如何分配全局变量。

我想我应该使用cudaSetDevice(),但我想知道我应该在哪里调用这个函数。

4

1 回答 1

3

当您创建这样的变量时:

__device__ int myval;

它是在全局范围内创建的。当你的应用程序启动时,它会在每个设备的 GPU 内存中进行分配。

在主机代码中(当使用诸如 之类的函数时cudaMemcpyFromSymbol()),您将访问与您最近的cudaSetDevice()呼叫相对应的任何一个。在设备代码中,您将访问与您的设备代码正在执行的设备相对应的任何一个

__device__声明在您的程序中处于全局范围内(并且是静态分配的)。全局范围的变量是在没有任何运行时活动的帮助下设置的。因此,没有机会指定应该在哪些设备上实例化变量,因此 CUDA 在所有存在的设备上实例化这些变量。然而,动态分配的设备变量是使用运行时调用分配的cudaMalloccudaMemcpy因此我们可以在这些调用之前cudaSetDevice在多 GPU 系统中调用,因此 CUDA 运行时在每个设备的基础上管理这些变量,这与行为一致大多数 CUDA 运行时 API 调用,它们通过cudaSetDevice.

于 2013-11-14T20:56:31.703 回答