MPI加cuda为什么不同进程在设备上分配的地址一样?

有一个函数,里面有变量width,d_jx。有4个进程,我试图输出width和d_jx首地址,width在不同的进程中地址不一样,但分配在设备端的地址却不变。myrank为进程号,就一块加速卡。
fun()
{

int width;
double d_jx;
cudaMalloc((void
*)&d_jx,d_size);
printf(“rank=%d,address of width=%x\n”,myrank,&width);

printf(“rank=%d,address of d_jx=%x\n”,myrank,d_jx);
MPI通讯;
kernel;
cudaMemcpy;
MPI通讯;

}
函数大郅结构就是先mpi通讯,然后调用kernel,然后数据拷回主机端,再mpi通讯。
输出结果:
rank=3,address of width=78a4e05c
rank=3,address of d_jx=209000
rank=2,address of width=aea090ec
rank=2,address of d_jx=209000
rank=0,address of width=86a777fc
rank=0,address of d_jx=209000
rank=1,address of width=bb5f1fac
rank=1,address of d_jx=209000

----------第二次调用该函数时---------
rank=0,address of width=86a777fc
rank=0,address of d_jx=22d000
rank=2,address of width=aea090ec
rank=2,address of d_jx=22d000
rank=3,address of width=78a4e05c
rank=3,address of d_jx=22d000
rank=1,address of width=bb5f1fac
rank=1,address of d_jx=22d000

还有一个问题是,多个进程运行该函数,然后各自运行了kernel函数,操作的数据都是一样的,各进程之间会不会有冲突?因为我程序跑到第二次调用该函数就出错了。今日第二问,谢谢啦!

楼主您好,不同CUDA进程里的相同设备地址,不代表他就是一个地址的。

(您可以理解成“虚拟地址”,实际上将映射到显存的不同的实际地址的)

这就如同在没有或者关闭了"进程地址随机化"(开启这个可以减少被攻击的可能)的Host OS上,您同样的一个exe, 执行出来的多个进程,可能同一个变量或者同样分配的一段缓冲区的地址“完全相同”,但这个依然是虚拟地址,仅对本进程有效, 不代表他们就是同一段物理内存的。

您的第二个问题,多个进程使用同一个kernel, 操作同样的缓冲区/参数,是不会有问题的,实际上他们是多个无关的独立副本,无论他们的device address是否看上去相同。

您第二次在一个进程里调用同一个kernel出错,不代表是其他进程的干扰的(实际上其他进程里的kernel也无法干扰这个进程的kernel的)。

谢谢。

好嘞,我仔细检查下我的代码。找到了问题的话,我再贴在这个帖子下面,谢谢啦!

:L:L,低级错误,二维数组地址起址弄错了。非常感谢版主解释多进程时使用同一个kernel的问题。

感谢来访。您客气了。