HPC集群上的多线程多GPU代码



我正试图使用OpenMP+OpenACC在多gpu上运行代码,因此一个线程连接到给定的单个gpu上,以便在多gpu上运行它,那么我应该在HPC集群上利用哪些资源来获得最大的性能和可扩展性。例如--每个任务的cpu,--每个cpu的ntask等

!Attaching threads to a gpu
thd = omp_get_max_threads()
ide = omp_get_thread_num()
!!$acc init device_type(acc_device_nvidia)
call acc_set_device_num(ide, acc_device_nvidia)

我建议询问您的系统管理员或集群的支持团队。使用哪个批调度选项或节点拓扑结构的答案将特定于集群。

注意,对于多gpu程序,我通常建议使用MPI+OpenACC。对于OpenMP+OpenACC,代码通常需要包括域分解,这对于OpenMP来说不是自然的,但对于MPI来说是自然的。因此,最好使用MPI,因为这样代码就可以在多个节点上运行,而不仅仅是在单个节点上。

再加上MPI,您将在等级和GPU之间建立一对一的关系,极大地简化了事情。假设您使用的是NVIDIA设备,您还可以利用CUDA Aware MPI等功能进行GPU直接通信,并利用MPS为每个GPU运行多个列。

几年前,这里有一个GTC2016关于使用MPI+OpenACC的好视频。

https://www.youtube.com/watch?v=xD42obq_ems

最新更新