首页 > 代码库 > MVAPICH2支持多线程和设备间通信问题

MVAPICH2支持多线程和设备间通信问题

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_AFFINITY0

         系统的配置文件在:/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_CUDA1

         系统的配置文件在:/etc/mvapich2.conf;

         用户的配置文件在:~/.mvapich2.conf;