由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 有熟悉CUDA的吗?不胜感谢赐教
相关主题
question about const reference请问该学点啥?
How to initialize object in constructor?什么FP能替代python
为啥 const Base cb 要求Base() {} 而 const vBase vb 不呢?问个选语言的问题
有没有玩CUDA的?并行可以降低计算复杂度??
我写的CUDA屏保软件 (转载)招GPU工程师 (转载)
我写的CUDA屏保软件-公开源码 (转载)MacBook Pro is more powerful than NVDA GPU?
请问程序同时在多个cpu上运行需要怎么改程序?基本适合深度学习的笔记本laptop
C++ Software Engineer 工作求内推(Boston)写GPU的汇编 - mission impossible
相关话题的讨论汇总
话题: gs话题: gpu话题: gr2话题: gr1话题: gpu1
进入Programming版参与讨论
1 (共1页)
s******e
发帖数: 2181
1
首先我有一些基本的问题想请教大拿,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;
}
}
kn
发帖数: 2446
2
还是去stackoverflow问吧

【在 s******e 的大作中提到】
: 首先我有一些基本的问题想请教大拿,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的技术客服远程登陆到我电脑上

p********n
发帖数: 3367
3
去留学网比较靠谱
s******e
发帖数: 2181
4
我是初学者,问题比较low,恳请指教。

【在 p********n 的大作中提到】
: 去留学网比较靠谱
s******e
发帖数: 2181
5
那个是干嘛的?

【在 kn 的大作中提到】
: 还是去stackoverflow问吧
f**********n
发帖数: 258
6
1,多GPU并行的情况下,我要从GPU0拷贝数据到GPU1,使用cudaMemcpy()必须要在当
前选中的GPU1下执行么?还是0和1都可以?
cudaMemcpy只能在CPU执行, neither 0 or 1 can execute this.
2,我使用了SPMD并行模式,每一个计算机核下挂了一个GPU,照理来说数据都是独立的
,各个GPU内的同名变量其实数据不同且相互不可见,但如果是在unified address
space下呢,这些相同变量名的变量相互冲突吗?
啥叫unified address space? Global memory 和 shared memory 在一个GPU share a
common memory space. If on different machine or cluster, their data is
independent.
我在matlab环境下用mexfunction编写的cuda,主程序是一个matlab program是一个
SPMD结构,SPMD结构里面调用mexfunction来实现GPU0内的数据传给GPU1,GPU1内的数
据传给GPU2。请高手指点哪里出了问题。MathWorks的技术客服远程登陆到我电脑上
debug两个小时没能解决问题。
debug on GPU is very hard. 我一般用printf把要看结果打印出来看(比较老的GPU
does not support printf but i guess your GPU support printf since this
question is asked in 2016.)
s******e
发帖数: 2181
7
谢谢你,总算遇到行家了。
关于第一个问题,我手上的参考材料是CUDA C Programming Guide。里面的sample
code在拷贝数据from GPU0 到GPU1的前一步,会先cudaSetDevice(1),然后才是cu
daMemcpy。所以比较费解。
第二个问题,那个是Guide里的说法,就是统一地址的意思,CPU和所有的GP
U只用一个地址表。但我们知道SPMD在启动的时候会给每个device或每个核
分配内存空间,所以当它和统一地址两种模式揉一起的时候,就不知道到底是咋回事了。

a

【在 f**********n 的大作中提到】
: 1,多GPU并行的情况下,我要从GPU0拷贝数据到GPU1,使用cudaMemcpy()必须要在当
: 前选中的GPU1下执行么?还是0和1都可以?
: cudaMemcpy只能在CPU执行, neither 0 or 1 can execute this.
: 2,我使用了SPMD并行模式,每一个计算机核下挂了一个GPU,照理来说数据都是独立的
: ,各个GPU内的同名变量其实数据不同且相互不可见,但如果是在unified address
: space下呢,这些相同变量名的变量相互冲突吗?
: 啥叫unified address space? Global memory 和 shared memory 在一个GPU share a
: common memory space. If on different machine or cluster, their data is
: independent.
: 我在matlab环境下用mexfunction编写的cuda,主程序是一个matlab program是一个

1 (共1页)
进入Programming版参与讨论
相关主题
写GPU的汇编 - mission impossible我写的CUDA屏保软件 (转载)
有没有人用过AMD的GPU我写的CUDA屏保软件-公开源码 (转载)
Re: VC里面的stl支持是不是很弱?请问程序同时在多个cpu上运行需要怎么改程序?
size不固定的struct怎么定义呀?C++ Software Engineer 工作求内推(Boston)
question about const reference请问该学点啥?
How to initialize object in constructor?什么FP能替代python
为啥 const Base cb 要求Base() {} 而 const vBase vb 不呢?问个选语言的问题
有没有玩CUDA的?并行可以降低计算复杂度??
相关话题的讨论汇总
话题: gs话题: gpu话题: gr2话题: gr1话题: gpu1