首先我有一些基本的问题想请教大拿,Nvidia的手册里找不到答案,sample code太简
单也太少。
1,多GPU并行的情况下,我要从GPU0拷贝数据到GPU1,使用cudaMemcpy()必须要在当
前选中的GPU1下执行么?还是0和1都可以?
2,我使用了SPMD并行模式,每一个计算机核下挂了一个GPU,照理来说数据都是独立的
,各个GPU内的同名变量其实数据不同且相互不可见,但如果是在unified address
space下呢,这些相同变量名的变量相互冲突吗?
我在matlab环境下用mexfunction编写的cuda,主程序是一个matlab program是一个
SPMD结构,SPMD结构里面调用mexfunction来实现GPU0内的数据传给GPU1,GPU1内的数
据传给GPU2。请高手指点哪里出了问题。MathWorks的技术客服远程登陆到我电脑上
debug两个小时没能解决问题。
spmd(3)
if labindex==1
A=gpuArray(zeros*(1));
elseif labindex==2
A=gpuArray(5*triu(ones(1)));
elseif labindex==3
A=gpuArray(10*tril(ones(1)));
end
B=test(A);
end
被调用的test函数是一个mexfunction
/* Transfer an array from one GPU to the next */
#include "mex.h"
#include "gpu/mxGPUArray.h"
#include "cuda.h"
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, mxArray const *prhs[])
{
mxGPUArray const *Gs;
double const *d_Gs0, *d_Gs1;
mxGPUArray *Gr1,*Gr2;
double *d_Gr1,*d_Gr2;
size_t size=1*sizeof(double);
int device;
/* Initialize the MathWorks GPU API. */
mxInitGPU();
cudaGetDevice(&device);
printf("device=%dn", device); //Labindex 1~3 <=> GPU 0~2
switch (device)
{
case 0:
Gs=mxGPUCreateFromMxArray(prhs[0]);
d_Gs0=(double const *)(mxGPUGetDataReadOnly(Gs));
plhs[0] = mxGPUCreateMxArrayOnGPU(Gs);
break;
case 1:
Gs=mxGPUCreateFromMxArray(prhs[0]);
d_Gs1=(double const *)(mxGPUGetDataReadOnly(Gs));
Gr1 = mxGPUCreateGPUArray(mxGPUGetNumberOfDimensions(Gs),
mxGPUGetDimensions(Gs),
mxGPUGetClassID(Gs),
mxGPUGetComplexity(Gs),
MX_GPU_DO_NOT_INITIALIZE);
d_Gr1 = (double *)(mxGPUGetData(Gr1));
// cudaDeviceEnablePeerAccess(0,0);
cudaMemcpy(d_Gr1, d_Gs0, size, cudaMemcpyDeviceToDevice);
plhs[0] = mxGPUCreateMxArrayOnGPU(Gr1);
break;
case 2:
Gs=mxGPUCreateFromMxArray(prhs[0]);
Gr2 = mxGPUCreateGPUArray(mxGPUGetNumberOfDimensions(Gs),
mxGPUGetDimensions(Gs),
mxGPUGetClassID(Gs),
mxGPUGetComplexity(Gs),
MX_GPU_DO_NOT_INITIALIZE);
d_Gr2 = (double *)(mxGPUGetData(Gr2));
// cudaDeviceEnablePeerAccess(1,0);
cudaMemcpy(d_Gr2, d_Gs1, size, cudaMemcpyDeviceToDevice);
plhs[0] = mxGPUCreateMxArrayOnGPU(Gr2);
break;
}
}