ОТ 0 ДО реальной видео карты - дома №2
📥 Готовые файлы
-
(заглушечные регистры — замените под своё RTL) PCIe‑скелет драйвера + утилита
-
(Опционально) учебный RTL‑скелет INT8 матмул + cocotb/Verilator:
Дорожка A — «быстрый результат» на Vitis AI DPU
Идея: запустить готовые модели из Vitis AI Model Zoo на совместимой плате (например, Kria KV260, ZCU104) — сразу получите FPS/латентность и референс по пропускной способности памяти и ПО. Документация и контейнеры официально поддерживаются AMD. AMD Documentation+1
A.1. Подготовка платы и хоста (начинающему)
-
Плата: возьмите KV260 (самый удобный старт) или ZCU104/ZCU102/VCK190. Для KV260 — запишите Starter Linux image на microSD и загрузите плату (пошагово в UG1089 и «Setting up … KV260»). AMD Documentation+2AMD Documentation+2
-
Хост: установите Docker, запустите контейнеры Vitis AI 3.5 (есть образы для PyTorch/TF2). AMD Documentation
Пример:docker pull xilinx/vitis-ai-pytorch-cpu:latest(или TF2). Docker Hub
A.2. Первый запуск и бенчмарки (за вечер)
-
Клонируйте примеры Vitis-AI и зайдите в контейнер (из гайда по контейнерам Vitis AI). AMD Documentation+1
-
Установите на плате VART (Vitis AI Runtime) по «Setting Up … Board». AMD Documentation
-
Запустите пример из Model Zoo (например, ResNet‑50) и зафиксируйте FPS/латентность. AMD Documentation
Критерий успеха: модель из Model Zoo стабильно работает на плате, есть цифры FPS/latency. Это ваша отправная точка для дальнейших сравнений. AMD Documentation
Дорожка B — «своя карта» на базе NVDLA (открытая архитектура)
Идея: взять открытый ИИ‑акселератор NVDLA (ядро + компилятор + рантайм), запустить в Virtual Platform, затем — на FPGA, а потом оформить как PCIe‑карту под ПК. NVDLA+1
Неделя 0 — Совсем с нуля: ставим инструменты и читаем обзор
-
Прочитать NVDLA Primer / индекс доков; понять, что такое loadable, рантайм и компилятор. NVDLA+1
-
Клонировать репозитории nvdla/hw и nvdla/sw. GitHub+1
Готово, когда: репозитории скачаны, вы понимаете, что nvdla_runtime запускает loadable, собранный компилятором. NVDLA+1
Неделя 1 — Софт‑стек: компилятор/рантайм и Virtual Platform
-
Соберите компилятор и runtime; разберитесь с «Runtime sample application» (
nvdla_runtimeusage). NVDLA+1 -
Поднимите NVDLA Virtual Platform (регистрово‑точный софт‑симулятор, QEMU+SystemC) и выполните тестовую сеть. NVDLA
Готово, когда: nvdla_runtime на VP выполняет сеть и выводит нормальный лог. NVDLA
Неделя 2 — NVDLA в готовом SoC под Linux на FPGA (рекомендую ESP от Columbia)
- Следуйте «How to integrate a third‑party accelerator (NVDLA)» в ESP: добавьте NVDLA‑плитку (AXI/APB, IRQ), соберите SoC, поднимите Linux на плате (например, VCU118) и запустите
nvdla_runtime. Гайд пошаговый, со скриптами. ESP — open SoC platform
Готово, когда: Linux на FPGA видит NVDLA, nvdla_runtime исполняет сеть. ESP — open SoC platform
Неделя 3 — Делаем «как видеокарта»: PCIe endpoint + DMA
Есть два пути:
-
Готовый IP AMD XDMA/QDMA (официальные драйверы/гайд PG195; быстро и надёжно). AMD Documentation+2AMD+2
-
Open‑source LitePCIe (ядро PCIe + утилиты; гибко, но больше DIY). GitHub
Шаги:
-
В RTL‑проект добавьте PCIe endpoint и DMA.
-
Сгенерируйте битстрим и установите карту в слот ПК.
-
На хосте проверьте
lspci -nn— виден ли Vendor/Device ID. (Далее используйте готовый драйвер от XDMA или свой.) infradead.org
Готово, когда: устройство видно в lspci, BAR‑ы читаются, простейшая запись/чтение MMIO работает. Linux Kernel Documentation
Неделя 4 — Простой драйвер и лоадер (скелеты уже приложены)
- Установите ядровые хедеры, соберите модуль из архива nvdla-pci-skeleton.zip:
makeвdriver/,insmod nvdla_pci.ko vendor=<VID> device=<DID> bar=<N>- Проверьте, что создался
/dev/nvdla0. - Соберите
user/nvdla_runи прогоните учебный файл (в качестве «модели» — любой бинарь, просто чтобы проверить DMA/регистры).
Скелет использует DMA‑coherent буфер и ioctl для запуска,
mmap— для загрузки «модели». По PCIe/ядру ориентируйтесь на оф. доки: «How to write Linux PCI drivers», и DMA API HOWTO. Linux Kernel Documentation+2Linux Kernel Documentation+2
Готово, когда: /dev/nvdla0 создаётся, GET_DMA_INFO/mmap/SUBMIT/POLL_DONE отрабатывают.
Неделя 5 — Подключаем реальный рантайм NVDLA
- Соберите nvdla_runtime и адаптируйте слой доступа к устройству (IOCTL/меммап) к вашему драйверу (или используйте существующие драйверы из ESP/репо). Запуск
*.nvdlaс вашего ПК через PCIe с DMA — конечная цель. NVDLA+1
Готово, когда: вы запускаете сеть через nvdla_runtime (или свою утилиту) с хоста по PCIe и получаете коррекные результаты.
Как работать с приложенными шаблонами (коротко)
1) Драйвер ядра (nvdla-pci-skeleton.zip)
-
Сборка:
sudo apt-get install -y build-essential linux-headers-$(uname -r) cd driver && make sudo insmod nvdla_pci.ko vendor=0x10ee device=0x7024 bar=0 # замените VID/DID/BAR под своё dmesg | tail -n 50 ls -l /dev/nvdla0 -
Что внутри:
- Регистры‑заглушки
REG_CMD_*,REG_STATUS/DONE— обязательно замените на ваши смещения/протокол. - DMA‑буфер выделяется через
dma_alloc_coherent, раздаётся в userspace черезmmap(см. DMA API HOWTO). Linux Kernel Documentation - Код шит по лекалу из официальных PCI‑доков ядра (регистрация драйвера, BAR‑ы, MMIO). Linux Kernel Documentation+1
- Если используете XDMA/QDMA, часто достаточно их драйверов (см. PG195), а пользовательский софт работает поверх. AMD Documentation
- Регистры‑заглушки
2) Утилита (user/nvdla_run)
-
Делает
ioctl(GET_DMA_INFO)→mmap()буфера → грузит файл*.nvdla→ioctl(SUBMIT)→ioctl(POLL_DONE). -
Это минимум для интеграции: замените
SUBMITпод ваш протокол (куда класть дескрипторы/адреса, какие биты старт/статус).
Частые ошибки и как не попасть
-
BAR не тот / регистры не по тем смещениям. Всегда проверяйте
lspci -vvи карту адресов в Vivado/IP‑ядре; используйте ioread32 на известных «сигнатурах», чтобы убедиться, что попадаете в нужные регистры. Linux Kernel Documentation -
DMA не идёт из‑за маски. Проверьте
dma_set_mask_and_coherent()(64‑бит → 32‑бит fallback), IOMMU настройки и объём CMA. См. DMA API HOWTO. Linux Kernel Documentation -
Пытаетесь «писать всё сами», имея XDMA/QDMA. Проще и надёжнее опереться на готовые IP/драйверы, см. PG195. AMD Documentation
-
Слишком поздно думаете о производительности памяти. NVDLA и любой тензорный блок упирается в движение данных. Планируйте банковку SRAM/тайлинг/двойную буферизацию заранее.
(Опционально) Шаги к ASIC
Когда FPGA‑прототип стабилен:
-
Синтез на SkyWater SKY130 через OpenLane/OpenROAD, обвязка Caravel (учебный PDK/MPW). Это позволит получить «чип в руках» и отладить физический поток. GitHub+1
-
ОЗУ — генерация макросов OpenRAM под SKY130. GitHub
Приложение: супер‑короткий чек‑лист по неделям
Неделя 0
□ Прочитать NVDLA Primer/Index; клонировать nvdla/hw, nvdla/sw. NVDLA+2NVDLA+2
□ Выбрать плату: для «быстрого» — KV260/ZCU104 (Vitis AI). AMD Documentation
Неделя 1
□ Запустить демо из Vitis AI Model Zoo на плате, получить FPS (референс). AMD Documentation
□ На ПК — поставить Docker/контейнеры Vitis AI (если идёте этим путём). AMD Documentation
Неделя 2
□ Собрать NVDLA compiler/runtime и прогнать сеть в Virtual Platform. NVDLA+1
Неделя 3
□ Интегрировать NVDLA в ESP SoC, загрузить Linux на FPGA, выполнить nvdla_runtime. ESP — open SoC platform
Неделя 4
□ Добавить PCIe endpoint + DMA (XDMA/QDMA или LitePCIe). Видно в lspci. AMD Documentation+1
Неделя 5
□ Поднять собственный драйвер (или взять готовый для XDMA), mmap DMA буфера, запустить учебную трансакцию. (Смотрите приложенный скелет + PCI/DMA‑доки ядра.) Linux Kernel Documentation+1
Неделя 6
□ Завести nvdla_runtime через ваш драйвер (или библиотеку к нему) и гонять реальные *.nvdla. NVDLA
Полезные ссылки (по делу)
-
NVDLA сайт/доки/репозитории: обзор, софт‑стек, VP, примеры runtime. NVDLA+4NVDLA+4NVDLA+4
-
ESP (Columbia): «How to integrate a third‑party accelerator (NVDLA)» — прям пошаговый мануал до FPGA. ESP — open SoC platform
-
Vitis AI: контейнеры, Model Zoo, getting started для плат (KV260/ZCU104). AMD Documentation+2AMD Documentation+2
-
PCIe/DMA в Linux: оф. доки ядра (PCI Driver HOWTO, DMA API HOWTO). Linux Kernel Documentation+2Linux Kernel Documentation+2
-
PCIe IP: AMD XDMA/QDMA (PG195) и LitePCIe. AMD Documentation+2AMD Documentation+2