如何在多个内核和多个GPU中共享全局内存?

时间:2013-03-22 02:28:28

标签: cuda qualifiers

----------------a.c---------------------
variable *XX;
func1(){
  for(...){
    for(i = 0; i < 4; i++)
       cutStartThread(func2,args)
  } 
}
---------------b.cu-------------------
func2(args){
  cudaSetDevice(i);
  xx = cudaMalloc();
  mykernel<<<...>>>(xx);
}
--------------------------------------

最近,我想为我的程序使用多个GPU设备。我的节点上有四张Tesla C2075卡。我使用四个线程来管理四个GPU。更重要的是,每个线程中的内核都会多次启动。一个简单的伪代码如上。我有两个问题:

  1. 变量XX是一个非常长的字符串,只在内核中读取。我想在mykernel的多次发布期间保留它。是否可以调用cudaMalloc并仅在mykernel首次启动时将指针传递给mykernel?或者我应该使用__device__限定词吗?

  2. XX用于四个线程,因此我将其声明为文件a.c中的全局变量。 cudaMalloc多个XX是否正确,或者我应该使用variable *xx[4]等数组?

1 个答案:

答案 0 :(得分:1)

  1. 对于在单个设备上运行的内核的使用,您可以调用cudaMalloc一次来创建保存字符串的变量XX,然后传递由cudaMalloc创建的指针(即{{1无论哪个内核都需要它。

    XX
  2. 为每个线程创建一个单独的XX变量,假设每个线程都用于访问其他设备。具体取决于XX的范围。但是一系列:

    #define xx_length 20
    char *XX;
    cudaMalloc((void **)&XX, xx_length * sizeof(char));
    ...
    kernel1<<<...>>>(XX, ...);
    ...
    kernel2<<<...>>>(XX, ...);
    etc.
    
  3. 在全球范围内,应该没问题。

    作为如何使用多个线程来管理多个GPU的示例,CUDA OpenMP sample可能会引起关注。