----------------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。更重要的是,每个线程中的内核都会多次启动。一个简单的伪代码如上。我有两个问题:
变量XX
是一个非常长的字符串,只在内核中读取。我想在mykernel
的多次发布期间保留它。是否可以调用cudaMalloc
并仅在mykernel
首次启动时将指针传递给mykernel
?或者我应该使用__device__
限定词吗?
XX
用于四个线程,因此我将其声明为文件a.c
中的全局变量。 cudaMalloc
多个XX
是否正确,或者我应该使用variable *xx[4]
等数组?
答案 0 :(得分:1)
对于在单个设备上运行的内核的使用,您可以调用cudaMalloc
一次来创建保存字符串的变量XX
,然后传递由cudaMalloc创建的指针(即{{1无论哪个内核都需要它。
XX
为每个线程创建一个单独的XX变量,假设每个线程都用于访问其他设备。具体取决于XX的范围。但是一系列:
#define xx_length 20
char *XX;
cudaMalloc((void **)&XX, xx_length * sizeof(char));
...
kernel1<<<...>>>(XX, ...);
...
kernel2<<<...>>>(XX, ...);
etc.
在全球范围内,应该没问题。
作为如何使用多个线程来管理多个GPU的示例,CUDA OpenMP sample可能会引起关注。