Подробное объяснение RDMA_verbs - анализ исходного кода ibv_reg_mr (зарегистрированная память)
Подробное объяснение RDMA_verbs - анализ исходного кода ibv_reg_mr (зарегистрированная память)

Подробное объяснение RDMA_verbs - анализ исходного кода ibv_reg_mr (зарегистрированная память)

Пользовательский режим

На примере libfabric стек вызовов выглядит следующим образом:

Язык кода:javascript
копировать
ibv_reg_mr -> NA_Mem_register -> na_ofi_mem_register -> fi_mr_regv -> ibv_reg_mr
    
Регистрация памяти
struct ibv_mr *ibv_reg_mr
__ibv_reg_mr
enum ib_uverbs_access_flags
IB_UVERBS_ACCESS_OPTIONAL_RANGE
ibv_reg_mr_iova2 -> глаголы: слабо отсортированные области памяти, добавьте флаг, разрешающий создание слабо отсортированных областей памяти. через этот класс MR доступ можно улучшить, разрешив системе изменять порядок определенных доступов. производительность。 Поскольку расслабленная сортировка является оптимизацией, драйверы, которые ее не поддерживают, могут ее просто игнорировать. Необязательный MR Доступный битовый диапазон определяется в соответствии с разделом соответствия ядра, и его первая запись будет иметь вид IBV_ACCESS_RELAXED_ORDERING。 Если приложение использует бит из необязательного диапазона, библиотека маскирует его на случай, если ядро ​​не поддерживает «MR». Дополнительный режим».
    reg_mr -> mlx5_vfio_reg_mr
    .reg_mr        = mlx5_reg_mr,
        ...
        execute_cmd_write(pd->context, IB_USER_VERBS_CMD_REG_MR, cmd, -> ib_uverbs_reg_mr

Состояние ядра

В качестве примера возьмем драйвер Intel E810:

Язык кода:javascript
копировать
ibv_reg_mr:
IB_USER_VERBS_CMD_REG_MR
ib_uverbs_reg_mr -> .reg_user_mr = irdma_reg_user_mr
    region = ib_umem_get -> закрепленная и пользовательская память, отображаемая через DMA, IB/глаголы: будет ib_umem_get()/ib_umem_release() экспорт в модуль, экспорт ib_umem_get()/ib_umem_release() и позвольте низкоуровневому драйверу контролировать, когда звонить ib_umem_get() Приходите и прикрепите DMA Сопоставить пользовательское пространство вместо того, чтобы всегда его вызывать При вызове драйвера низкого уровня reg_user_mr метод раньше ib_uverbs_reg_mr() середина. Также переместите эти функции в ib_core модуль вместо ib_uverbs in, чтобы модули драйверов, которые их используют, не зависели от ib_uverbs。 Это имеет много преимуществ: - Это лучший дизайн с точки зрения превращения общего кода в библиотеку, которую можно использовать или переопределять кодом, специфичным для устройства, в соответствии с деталями конкретного устройства. - Драйверам, которым не требуются закрепленные области памяти пользовательского пространства, не нужно переносить вызовы. ib_mem_get() потеря производительности. Например, хотя я и не пытался реализовать это в этом патче, ipath Драйверы должны иметь возможность избегать закрепленной памяти и использовать только copy_{to,from}_user() для доступа к областям памяти пользовательского пространства. - Буферы, требующие специальной обработки сопоставления, могут быть идентифицированы драйверами низкого уровня. Например, используя дополнительное сопоставление флагов CQ Буфер, может решить проблему в пользовательском пространстве mthca CQ некоторые специфические для Altix проблема с сортировкой памяти. - Необходимо исправить сумму для содержимого за пределами области памяти. DMA Драйверы, отображающие память пользовательского пространства, можно использовать напрямую. ib_umem_get() вместо использования его reg_phys_mr Дополнительные параметры метода можно взломать. Например, объединиться mlx4 Драйверу требуются булавки и DMA картографирование QP и CQ буферы, но для этих буферов нет необходимости создавать ключи памяти. Итак, самое чистое решение mlx4 существовать create_qp и create_cq Вызывается в методе ib_umem_get() -> вызов ib_umem_get Завершение операции закрепления страницы памяти + Организация закрепленных страниц памяти в DMA SG List
        can_do_mlock -> [PATCH] IB uverbs: реализация закрепления памяти (pin), добавляет поддержку закрепления области памяти пользовательского пространства и возврата списка страниц в этой области. Это включает в себя на основе vm_locked Отслеживайте закрепленную память и не допускайте превышения непривилегированными пользователями RLIMIT_MEMLOCK
        mmgrab(mm) -> Захватить память (цитата +1)
        __get_free_page
        npages = ib_umem_num_pages(umem)
            ib_umem_num_dma_blocks(umem, PAGE_SIZE) -> RDMA/Я знаю: Воля ib_umem_num_pages() Разделить на ib_umem_num_dma_blocks(),ib_umem_num_pages() Только путем прямого существования CPU Используется на странице SGL вещи для использования. Строить DMA Список драйверов, которым следует использовать новую ib_num_dma_blocks(), который возвращает rdma_umem_for_each_block() Количество фрагментов, которые будут возвращены. сделать DMA Драйверы являются общими и требуют различных реализаций. Только если запрошенный размер страницы < PAGE_SIZE и/или IOVA == umem->address когда, исходя из umem->address вычислить DMA Количество блоков допустимо. Напротив, ДМА Количество страниц должно бытьсуществовать IOVA адресв космосевычислить,вместо umem->address。 Таким образом, ИОВА Должен хранить существование umem Внутри,чтобы его можно было использовать для этихвычислить。 Сейчас существуют, по умолчанию установлено значение umem->address исуществоватьвызов ib_umem_find_best_pgsz() пора это исправить. Это позволяет водителю безопасно перейти в ib_umem_num_dma_blocks()
        cond_resched -> RDMA/umem:существовать ib_umem_get() Добавьте пункт отправки в,картографированиетакой маленький, как 64GB может понадобиться 10 Более секунды, триггер CONFIG_PREEMPT_NONE=y проблема с ядром. ib_umem_get() ужесуществовать x86_64 выше 2MB Разделите работу на блоки,существование Добавлено в постоянный цикл cond_resched() достаточно, чтобы решить проблему. Обратите внимание, что sg_alloc_table() Все еще можно использовать более 100 Миллисекунды, это тоже проблематично. Это может произойти позже. ib_umem_add_sg_table() решить в,по требованиюсуществовать sql Добавьте новый блок в . существовать Некоторая трудоемкая обработка, такая как файловая системаи Внутри Некоторые пути для хранения и восстановления будутвызовcond_resched, Используйте cond_resched, чтобы проверить, есть ли возможность планирования. Для непревентивного Внутри В ядерном плане,существовать Внутри Многие места в ядерной,Особенно операции с файловой системойи Внутри В некоторых трудоемких путях, связанных с управлением хранилищем,были идентифицированы разработчиками ядра,иделатьиспользоватьcond_reschedчтобы уменьшить задержку, cond_resched() функция, ее функция — упреждающее делегирование полномочий и ожидание следующего запланированного запуска. ссылка: https://www.zhihu.com/question/35004859
        pin_user_pages_fast
        sg_alloc_append_table_from_pages
        ib_dma_map_sgtable_attrs
    ib_copy_from_udata(&req, udata, min(sizeof(req), udata->inlen)
    irdma_alloc_iwmr
        ib_umem_find_best_pgsz
        ib_umem_num_dma_blocks
    case IRDMA_MEMREG_TYPE_QP
        irdma_reg_user_mr_type_qp(req, udata, iwmr)
            irdma_handle_q_mem(iwdev, &req, iwpbl, lvl)
                irdma_setup_pbles -> Скопируйте страницу пользователя в PBLE
                case IRDMA_MEMREG_TYPE_QP
                    irdma_check_mem_contiguous
            rdma_udata_to_drv_context
            list_add_tail(&iwpbl->list, &ucontext->qp_reg_mem_list)
    case IRDMA_MEMREG_TYPE_MEM
        irdma_reg_user_mr_type_mem
            irdma_setup_pbles -> Использовать реконструкцию битовой маски PBLE функция для представления требуемого PBLE уровень, при использовании 2 параметры use_pble и lvl_one_only Сделайте код загроможденным
            HW делатьиспользовать Хозяин Внутри Хранится как несколько объектов контекста протокола.и Резервное хранилище для отслеживания статуса очереди。 Кэш памяти хоста (HMC) отвечает за управление хранилищемсуществовать Хозяин Внутри Компоненты этих объектов в памяти。 Добавляйте функции и структуры данных для управления HMC Выделение страниц поддержки для использования различными объектами, В этой статье в основном анализируются преимущества и недостатки механизма управления контекстной памятью драйвера RDMA, такого как intel/hns3/mlx5 в ядре Linux: https://zhuanlan.zhihu.com/p/610503666, Реализация записей списка физических буферов (PBLE) Менеджер ресурсов для управления PBLE HMC пул объектов ресурсов, 
                irdma_get_pble ?
                    get_lvl1_lvl2_pble
                        get_lvl1_pble
                            irdma_prm_get_pbles
                                bitmap_find_next_zero_area
                                bitmap_set
                        get_lvl2_pble
                            ...
                    add_pble_prm -> Host Memory Cache (HMC) Кэш памяти хоста, prm Управление ресурсами страницы
                        irdma_get_type
                        add_sd_direct
                            irdma_add_sd_table_entry
                            dma_alloc_coherent
                            memcpy(&sd_entry->u.pd_table.pd_page_addr, &dma_mem,
                        add_bp_pages -> Добавить страницу внутренней памяти для описания сегмента
                            irdma_pble_get_paged_mem
                                irdma_map_vm_page_list
                                    vmalloc_to_page -> найден vmalloc( )Местовыделено Внутрихранимый виртуальныйадрес Местокартографированиефизическая страница,и Возвращает дескриптор указателя страницы
                                    dma_map_page -> Воля一页物理Внутрисохранятькартографирование
                            irdma_add_sd_table_entry
                            irdma_add_pd_table_entry
                                dma_alloc_coherent
                                memcpy(&pd_entry->bp.addr, page, sizeof(pd_entry->bp.addr))
                                memcpy(pd_addr, &page_desc, sizeof(*pd_addr))
                                irdma_invalidate_pf_hmc_pd -> делать PF в аппаратном обеспечении pd Кэш недействителен
                                    writel(val, dev->hw_regs[IRDMA_PFHMC_PDINV])
                        irdma_prm_add_pble_mem
                            bitmap_zalloc
                        irdma_hmc_sd_one
                            irdma_set_sd_entry
                            or irdma_clr_sd_entry
                            dev->cqp->process_cqp_sds(dev, &sdinfo) -> irdma_update_sds_noccq
                                cqp_sds_wqe_fill
                                irdma_get_cqp_reg_info
                                irdma_sc_cqp_post_sq
                                irdma_cqp_poll_registers
                        list_add(&chunk->list, &pble_rsrc->pinfo.clist)
                    get_lvl1_lvl2_pble
                irdma_copy_user_pgaddrs -> Изменить адрес страницы пользователя копировать на локальный pble Операционная система
                    sg_page -> Получите указатель страницы, соответствующий списку разброса.
                    rdma_umem_for_each_dma_block -> Итерировать umem продолжения DMA кусок
                        rdma_block_iter_dma_address -> получатькусок Итерировать Ток, проводимыйкусок Выравнивание dma адрес
                        irdma_next_pbl_addr
            irdma_check_mr_contiguous
                irdma_check_mem_contiguous
            irdma_create_stag -> случайный олень
                get_random_bytes
                irdma_alloc_rsrc -> RDMA/irdma: зарегистрировать вторичный драйвер и реализовать частный канал. ОП, регистрацию можно пройти по адресу Intel PCI netdev водитель i40e иice Подключиться к вспомогательному RDMA Помощь по оборудованию водитель. Реализация операций частного канала и регистрация сетевых уведомителей.
            irdma_hwreg_mr(iwdev, iwmr, access) -> Отправьте команду cqp для регистрации в памяти.
                irdma_alloc_and_get_cqp_request
                irdma_get_mr_access
                cqp_info->cqp_cmd = IRDMA_OP_MR_REG_NON_SHARED -> irdma_sc_mr_reg_non_shared
                    irdma_sc_cqp_get_next_send_wqe
                    ...
                    set_64bit_val(wqe, 32, info->reg_addr_pa)
                    irdma_sc_cqp_post_sq
                stag_info->reg_addr_pa = iwmr->pgaddrmem[0]
                irdma_handle_cqp_op
                irdma_put_cqp_request
UVERBS_OBJECT_MR
ib_check_mr_access
uobj_get_obj_read
reg_user_mr

Подвести итог

  • Процесс регистрации памяти очень длительный, дорогостоящий и трудоемкий. Уровень приложения обычно регистрирует пул памяти заранее во время инициализации и больше не регистрирует его динамически на пути ввода-вывода.

ссылка

linux kernel master

Сяобин (ssbandjl)

блог: https://cloud.tencent.com/developer/user/5060293/articles | https://logread.cn | https://blog.csdn.net/ssbandjl | https://www.zhihu.com/people/ssbandjl/posts

столбец ДПУ

https://cloud.tencent.com/developer/column/101987

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose