我们正在尝试为多个节点提供通用的 nbody 算法。一个节点有 2 个 GPU 和 1 个 CPU。
我们只想在 GPU 上使用 openacc 计算 n-body。在对 openacc 做了一些研究之后,我不确定如何将计算扩展到多个 GPU。
是否可以使用只有一个线程和 openacc 的 2 个 GPU?如果没有,什么是合适的方法,使用 openMP 在一个节点上使用两个 GPU 并通过 MPI 与其他节点通信?
我们正在尝试为多个节点提供通用的 nbody 算法。一个节点有 2 个 GPU 和 1 个 CPU。
我们只想在 GPU 上使用 openacc 计算 n-body。在对 openacc 做了一些研究之后,我不确定如何将计算扩展到多个 GPU。
是否可以使用只有一个线程和 openacc 的 2 个 GPU?如果没有,什么是合适的方法,使用 openMP 在一个节点上使用两个 GPU 并通过 MPI 与其他节点通信?
OpenACC 运行时库提供例程 ( acc_set_device_num()
, acc_get_device_num()
) 来选择特定线程将针对哪个加速器设备,但使用单个线程同时使用多个设备并不方便。相反,可以使用 OpenMP 或 MPI。
例如(从这里开始)OpenMP 的基本框架可能是:
#include <openacc.h>
#include <omp.h>
#pragma omp parallel num_threads(2)
{
int i = omp_get_threadnum();
acc_set_device_num( i, acc_device_nvidia );
#pragma acc data copy...
{
}
}
也可以使用 MPI 完成,和/或您可以使用 MPI 在节点之间进行通信,这是典型的。