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