ОТ 0 ДО реальной видео карты - дома №2

Admin Admin 4 Октября 2025

📥 Готовые файлы


Дорожка A — «быстрый результат» на Vitis AI DPU

Идея: запустить готовые модели из Vitis AI Model Zoo на совместимой плате (например, Kria KV260, ZCU104) — сразу получите FPS/латентность и референс по пропускной способности памяти и ПО. Документация и контейнеры официально поддерживаются AMD. AMD Documentation+1

A.1. Подготовка платы и хоста (начинающему)

  1. Плата: возьмите KV260 (самый удобный старт) или ZCU104/ZCU102/VCK190. Для KV260 — запишите Starter Linux image на microSD и загрузите плату (пошагово в UG1089 и «Setting up … KV260»). AMD Documentation+2AMD Documentation+2

  2. Хост: установите Docker, запустите контейнеры Vitis AI 3.5 (есть образы для PyTorch/TF2). AMD Documentation
    Пример: docker pull xilinx/vitis-ai-pytorch-cpu:latest (или TF2). Docker Hub

A.2. Первый запуск и бенчмарки (за вечер)

  1. Клонируйте примеры Vitis-AI и зайдите в контейнер (из гайда по контейнерам Vitis AI). AMD Documentation+1

  2. Установите на плате VART (Vitis AI Runtime) по «Setting Up … Board». AMD Documentation

  3. Запустите пример из 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

  1. Соберите компилятор и runtime; разберитесь с «Runtime sample application» (nvdla_runtime usage). NVDLA+1

  2. Поднимите 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

Шаги:

  1. В RTL‑проект добавьте PCIe endpoint и DMA.

  2. Сгенерируйте битстрим и установите карту в слот ПК.

  3. На хосте проверьте lspci -nn — виден ли Vendor/Device ID. (Далее используйте готовый драйвер от XDMA или свой.) infradead.org

Готово, когда: устройство видно в lspci, BAR‑ы читаются, простейшая запись/чтение MMIO работает. Linux Kernel Documentation

Неделя 4 — Простой драйвер и лоадер (скелеты уже приложены)

  • Установите ядровые хедеры, соберите модуль из архива nvdla-pci-skeleton.zip:
    1. make в driver/, insmod nvdla_pci.ko vendor=<VID> device=<DID> bar=<N>
    2. Проверьте, что создался /dev/nvdla0.
    3. Соберите 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() буфера → грузит файл *.nvdlaioctl(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‑прототип стабилен:

  1. Синтез на SkyWater SKY130 через OpenLane/OpenROAD, обвязка Caravel (учебный PDK/MPW). Это позволит получить «чип в руках» и отладить физический поток. GitHub+1

  2. ОЗУ — генерация макросов 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

Полезные ссылки (по делу)

Для ответа вы можете авторизоваться