Почему NVIDIA GPUDirect RDMA медленнее при отправке данных с графического процессора на сетевой адаптер, чем в обратном направлении?
У меня есть два узла с процессором AMD EPYC 7452, графическим процессором NVIDIA V100 и сетевой картой Mellanox ConnectX-6. Я реализовал простой тест RDMA, используя IB Verbs API и NVIDIA GPUDirect. Вот результат:
Direction : Node 1 <- Node 2 Node 1 -> Node 2
Node 1 CPU memory <-> Node 2 CPU memory : 24.480147 GB/s 24.532782 GB/s
Node 1 GPU memory <-> Node 2 CPU memory : 14.291703 GB/s 6.113229 GB/s
Node 1 GPU memory <-> Node 2 GPU memory : 6.122043 GB/s 6.128194 GB/s
Node 1 CPU memory <-> Node 2 GPU memory : 6.104582 GB/s 14.295329 GB/s
- ~ 24 ГБ / с - это пропускная способность, ограниченная IB HDR, поэтому она ожидаема. (200 Гбит / с = 25 ГБ / с)
- ~14 ГБ / с - это пропускная способность, ограниченная PCIe Gen 3, поэтому она ожидаема. (около 16 ГБ / с)
- Неожиданные числа ~ 6 ГБ / с.
Короче говоря, производительность снижается, когда пути RDMA занимают
GPU -> NIC
, т. е. читать с графических процессоров.
NIC -> GPU
путь не вредит производительности. NCCL, популярная коммуникационная библиотека, также, похоже, распознает это явление и отключает RDMA по умолчанию на платформе PCIe при отправке данных с графического процессора. (Ссылка)
У меня вопрос, в чем может быть основная причина снижения производительности? Как вообще может быть затронуто только одно направление?