MVAPICH2多线程支持问题
MVAPICH2为了优化性能,默认的情况是将进程绑定到处理器的。因此默认是只支持单线程的,如果要运行MPI多线程程序,可以通过以下方式运行多线程:
$ mpirun -np 2 –env MV2_ENABLE_AFFINITY 0 ./mpi
app
(或者:$ mpirun_rsh -np 2
MV2_ENABLE_AFFINITY =0 ./mpi app)
当然在程序mpiapp的代码中MPI初始化函数MPI_Init(),要用函数MPI_Init_thread()代替,例如:
int provided;
MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE,
&provided);
if(provided != MPI_THREAD_MULTIPLE)
{
printf("MPI do not Support Multiple
thread\n");
MPI_Abort(MPI_COMM_WORLD,-1);
}
环境配置文件:将配置文件中MV2_ENABLE_AFFINITY置0;
系统的配置文件在:/etc/mvapich2.conf;
用户的配置文件在:~/.mvapich2.conf;
GPU内存间的MPI通信
一般在没有CUDA的支持下,设备内存间的MPI通信如下:
cudaMemcpy(host buf, device buf, size,
cudaMemcpyDeviceToDevice);
MPI_Send(host buf, size, MPI CHAR, 1, 100, MPI COMM WORLD, req);
若要从设备到设备内存,设备内存到主机内存,主机内存到设备内存的MPI通信,
则设置环境变量 MV2 USE CUDA 为1 (系统默认是0,即不支持设备间内存通信),设备间可以直接通信,如下:
MPI_Send(device buf, size, MPI CHAR, 1, 100, MPI COMM WORLD,
req);
$ mpirun -np 2 –env MV2_USE_CUDA 1 ./mpi
app
(或者$ mpirun_rsh -np 2
MV2_USE_CUDA =1 ./mpi app)
环境配置文件:将配置文件中MV2_USE_CUDA置1;
系统的配置文件在:/etc/mvapich2.conf;
用户的配置文件在:~/.mvapich2.conf;