Здравствуйте. Вопрос о взаимодействии MPI с CUDA, а именно какая будет использована технология передачи?
Есть MVAPICH2 2.3 собранный с --enable-cuda.
Установлена переменная окружения MV2_USE_CUDA = 1, чтобы включить поддержку MPI с CUDA 9+
И есть 2 карты на узле, который соединены nvlink напрямую и pci напрямую (т.е. поддерживают P2P и RDMA).
Запускается 2 MPI потока на такой узле, первый поток использует GPU_0, второй поток использует GPU_1.
И есть такой код
cudaSetDevice(rank);
double *d_out, *d_in;
cudaMemcpyManaged((void**)& d_out, size);
cudaMemcpyManaged((void**)& d_in, size);
// тут инициализация d_out
// И вопрос в этом месте??
// По какому каналу памяти пойдут данные, когда я вызову mpi_функцию для передачи данных прямиком из GPU памяти в GPU память
MPI_Status status;
// 1. Будет ли этот вызов использовать P2P (по nvlink передача) или RDMA (по pci) или CPU (через хоста будет обмен) ??
MPI_Sendrecv(d_out, count, MPI_DOUBLE, rankTo, 777, d_in, count, MPI_DOUBLE, rankTo, 777, &status);
// 2. Или нужно включить P2P и тогда MPI будет его использовать
cudaDeviceEnablePeerAccess(rankTo, 0);
MPI_Sendrecv(d_out, count, MPI_DOUBLE, rankTo, 777, d_in, count, MPI_DOUBLE, rankTo, 777, &status);
cudaDeviceDisablePeerAccess(rankTo);
// 3. Есть тестовый вариант через CPU
double *h_out, h_in;
h_out = new double[count];
h_in = new double[int];
cudaMemcpy(h_out, d_out, size, cudaMemcpyDeviceToHost);
MPI_Sendrecv(h_out, count, MPI_DOUBLE, rankTo, 777, h_in, count, MPI_DOUBLE, rankTo, 777, &status);
cudaMemcpy(d_in, h_out, size, cudaMemcpyHostToDevice);
delete[] h_out;
delete[] h_in;
И вот есть подозрение, что 1 вариант равносилен 3 варианту, а очень хочется, чтобы передача шла с использованием P2P.
И хотелось бы узнать, как сделать передачу по P2P?
Может нужно добавить какие нить переменные окружения? ( Например MV2_CUDA_ENABLE_MANAGED=1, MV2_CUDA_MANAGED_IPC=1)