GDRCopy#

GDRCopy - это библиотека памяти GPU с низкой задержкой, основанная на технологии NVIDIA GPUDirect RDMA, которая предоставляет API для прямого доступа к памяти GPU из сторонних устройств. Также она позволяет использовать те же API для создания полностью корректных сопоставлений CPU с памятью GPU.

GDRCopy предоставляет инфраструктуру для создания пользовательских сопоставлений памяти GPU, с которыми в дальнейшем можно работать, как с обычной памятью хоста.

В процессе создания пользовательских сопоставлений памяти GPU возникает дополнительная возможность - библиотека низкоуровневого копирования с характеристиками:

  • Очень низкий расход ресурсов, так как управление осуществляется CPU. Вызов функции cudaMemcpy может занять 6-7 мс. Фиксация памяти занимает от 10 мкс до 1 мс, в зависимости от размера буфера.

  • Быстрое копирование данных из памяти хоста в GPU (H-D, Host-to-Device) благодаря объединению операций. Пропускная способность при этом составляет 6-8 ГБ/с на процессорах Ivy Bridge Xeon, но зависит от архитектуры системы.

  • Медленное копирование данных из GPU на хост (D-H, Device-to-Host), так как используемый механизм не позволяет заранее загрузить данные и транзакции burst reads не генерируются через PCIe.

Работает совместно с GPU Operator и Network Operator.

Тесты#

Библиотека включает в себя:

  • gdrcopy_sanity - модульные тесты для библиотеки и драйвера NVIDIA;

  • gdrcopy_copybw - минимальное приложение, которое вычисляет пропускную способность чтения/записи для конкретного размера буфера;

  • gdrcopy_copylat - бенчмарк-приложение, которое вычисляет задержку копирования чтения/записи для различных размеров буферов;

  • gdrcopy_apiperf - приложение для оценки задержки каждого вызова API GDRCopy;

  • gdrcopy_pplat - бенчмарк-приложение, вычисляющее задержку круговых пингов между GPU и CPU.

Например, запустите модульные тесты для проверки работоспособности, используя команду:

gdrcopy_sanity

Пример вывода:

Total: 28, Passed: 28, Failed: 0, Waived: 0

List of passed tests:
    basic_child_thread_pins_buffer_cumemalloc
    basic_child_thread_pins_buffer_vmmalloc
    basic_cumemalloc
    basic_small_buffers_mapping
    basic_unaligned_mapping
    basic_vmmalloc
    basic_with_tokens
    data_validation_cumemalloc
    data_validation_vmmalloc
    invalidation_access_after_free_cumemalloc
    invalidation_access_after_free_vmmalloc
    invalidation_access_after_gdr_close_cumemalloc
    invalidation_access_after_gdr_close_vmmalloc
    invalidation_fork_access_after_free_cumemalloc
    invalidation_fork_access_after_free_vmmalloc
    invalidation_fork_after_gdr_map_cumemalloc
    invalidation_fork_after_gdr_map_vmmalloc
    invalidation_fork_child_gdr_map_parent_cumemalloc
    invalidation_fork_child_gdr_map_parent_vmmalloc
    invalidation_fork_child_gdr_pin_parent_with_tokens
    invalidation_fork_map_and_free_cumemalloc
    invalidation_fork_map_and_free_vmmalloc
    invalidation_two_mappings_cumemalloc
    invalidation_two_mappings_vmmalloc
    invalidation_unix_sock_shared_fd_gdr_map_cumemalloc
    invalidation_unix_sock_shared_fd_gdr_map_vmmalloc
    invalidation_unix_sock_shared_fd_gdr_pin_buffer_cumemalloc
    invalidation_unix_sock_shared_fd_gdr_pin_buffer_vmmalloc