我想改进MPI-CPU-node和单个GPU之间的“数据传输”算法。
使用NUMPROCS节点,每个MPI节点都有一个带有Ntot / NUMPROCESS float4的1D阵列。
我的算法非常简单:
1)在主节点上收集大数组(大小为Ntot)的1D数组(MPI_GATHER)。
2)使用主节点,通过cudaMemcpy函数将大数组发送到GPU。 CUDA内核与主节点一起启动。
是否可以避免第一步?我的意思是,每个MPI节点通过cudaMemcpy发送其数组,并且串联直接在GPU的内存上完成。
答案 0 :(得分:1)
由于您的MPI-CPU节点与GPU在同一物理主机上运行,因此您可以避开第一步。
您可以使用异步函数CudaMemcpyAsync()
执行第二步。该函数有一个流参数。它有助于同时进行GPU计算和memcpy
。
在每个过程中,您都可以使用CudaSetDevice(devicenumber)
来控制您选择的GPU。
有关详细信息,请参阅CUDA手册。