在多个GPU上分配全局变量

时间:2013-11-14 09:04:37

标签: cuda

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

__device__ uint32_t aaa;

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

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

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

1 个答案:

答案 0 :(得分:3)

创建如下变量时:

__device__ int myval;

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

在主机代码中(使用cudaMemcpyFromSymbol()等功能时),您将访问与最近cudaSetDevice()次呼叫相对应的任何一项。在设备代码中,您将访问与您的设备代码正在执行的设备相对应的任何一个

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