Я хочу скопировать данные между двумя графическими процессорами в разных процессах, используя старый API для графических процессоров, которые не поддерживают одноранговый (они не находятся в одном корневом концентраторе PCI). Однако у меня возникают проблемы с синхронизацией. Основные шаги, как я их понимаю, являются:Как использовать cudaMemcpyPeer для копирования данных GPU между GPU в разных процессах, которые не могут использовать P2P?
(процесс 0, устройство 0):
void * d_X;
cudaMalloc(&d_X, size);
// Put something into d_X;
cudaIpcMemHandle_t data;
cudaIpcGetMemHandle(&data, (void *)d_X);
-> Отправить адрес и размер Обработать 1 через MPI_Send/MPI_Recv
(процесс 1, устройство 1):
cudaSetDevice(1);
void * d_Y;
cudaMalloc(&d_Y, size);
cudaSetDevice(0); // Need to be on device 0 to copy from device 0
void * d_X;
cudaIpcOpenMemHandle(&d_X, data, cudaIpcMemLazyEnablePeerAccess);
cudaMemcpyPeer(d_Y, 1, d_X, 0, size);
cudaIpcCloseMemHandle(d_X);
Это в основном правильно? Как только я уверен, что это правильный подход, мне нужно правильно разобраться, как правильно синхронизироваться, потому что ясно, что у меня проблемы с синхронизацией (в основном, копирование старой памяти).
Мои графические процессоры поддерживают UVA, но cudaDeviceCanAccessPeer
возвращает 0. Я на самом деле пытаюсь написать код, который работает как для P2P, так и для этого, но это бит, с которым у меня проблемы.
Вы изучили образец кода cuda simpleIPC? –
К сожалению, это только для P2P, и он не копирует память, поэтому есть двусмысленность относительно того, правильно ли я делаю. –