ChipStar позволяет компилировать и запускать приложения HIP и CUDA на платформах, поддерживающих SPIR-V в качестве промежуточного представления устройства. Он поддерживает OpenCL и Level Zero как альтернативы низкоуровневой среды выполнения.
Пользовательская документация
Документация разработчика
Список (не)поддерживаемых функций
Изначально чипStar был создан путем объединения работ по созданию прототипов, выполненных в проектах (ныне устаревших) HIPCL и HIPLZ.
Если вы хотите цитировать ChipStar в научных публикациях, пожалуйста, обратитесь к аннотации к плакату HIPCL при обсуждении бэкэнда OpenCL и/или к документу конференции HIPLZ при упоминании бэкэнда Level Zero. Основные разработчики чипСтар пишут соответствующую статью об интегрированном проекте чипСтар, но она находится в стадии разработки.
Название ChipStar происходит от c
и hip
, а также слова Star
, которое означает звездочку, типичный подстановочный знак оболочки, обозначающий намерение сделать так, чтобы «приложения CUDA и HIP работали повсюду». Ранее проект назывался ЧИП-СПВ.
Следующие библиотеки были портированы для работы на графических процессорах Intel через MKL:
hipBLAS (может быть встроен как часть ChipStar, добавив -DCHIP_BUILD_HIPBLAS=ON
)
hipFTT (может быть встроен как часть ChipStar, добавив -DCHIP_BUILD_HIPFTT=ON
)
хипSOLVER
hipCUB
Следующие библиотеки были портированы и должны работать на любой платформе:
рокРАНД
рокПРИМ
Если вам нужна библиотека, которая еще не поддерживается, откройте проблему, указав, какие библиотеки вам нужны и какое приложение вы пытаетесь создать.
На данный момент чипСтар тестировался с использованием следующих приложений:
libCEED Наша версия включает в себя несколько обходных путей.
Исходный код GAMESS не является общедоступным.
Тесты HeCBench CUDA.
Самый быстрый способ начать — использовать готовый контейнер Docker. Пожалуйста, обратитесь к Docker README. Если вы хотите собрать все самостоятельно, вы можете следовать подробному началу работы.
Хотя ChipStar 1.1 уже можно использовать для успешного запуска различных крупных приложений HPC, он все еще находится в стадии разработки и имеет множество известных проблем и нереализованных функций. Есть также известные оптимизации с низкой производительностью, которые еще предстоит сделать. Тем не менее, мы считаем, что ChipStar готов к более широкому тестированию и приветствуем вклад сообщества в виде воспроизводимых отчетов об ошибках и качественных запросов на включение.
Примечания к выпуску версий 1.1, 1.0 и 0.9.
Cmake >= 3.20.0
Clang и LLVM 17 (Clang/LLVM 15 и 16 также могут работать)
Можно установить, например, добавив репозиторий Debian/Ubuntu LLVM и установив пакеты clang-17 llvm-17 clang-tools-17.
Для достижения наилучших результатов установите Clang/LLVM из ветки ChipStar LLVM/Clang, в которой есть исправления, которых еще нет в исходном проекте LLVM. Ниже описан способ сборки и установки исправленных версий по сценарию.
SPIRV-LLVM-Translator из ветки, соответствующей основной версии LLVM: (например, llvm_release_170 для LLVM 17), llvm-spirv.
Убедитесь, что встроенный двоичный файл llvm-spirv установлен по тому же пути, что и двоичный файл clang, иначе clang может найти и использовать другой llvm-spirv, что приведет к ошибкам.
Рекомендуется использовать вилку LLVM ChipStar, для которой еще не выпущено несколько патчей. Для этого вы можете использовать скрипт, включенный в репозиторий чипСтар:
./scripts/configure_llvm.sh Использование: ./configure_llvm.sh --version <версия> --install-dir <каталог> --link-type static(default)/dynamic --only-necessary-spirv-exts <on|off> --binutils- расположение заголовка <путь> -- версия: LLVM версии 15, 16, 17, 18, 19 --install-dir: каталог установки --link-type: статический или динамический (по умолчанию: статический) --only-necessary-spirv-exts: вкл. или выкл. (по умолчанию: выкл.) --binutils-header-location: путь к заголовку binutils (по умолчанию: пусто) ./scripts/configure_llvm.sh --version 17 --install-dir /opt/install/llvm/17.0cd llvm-project/llvm/build_17 make -j 16<sudo> make install
Или вы можете выполнить действия вручную:
git clone --глубина 1 https://github.com/CHIP-SPV/llvm-project.git -bchipStar-llvm-17cd llvm-project/llvm/projects git клон --глубина 1 https://github.com/CHIP-SPV/SPIRV-LLVM-Translator.git -b чипStar-llvm-17cd ../..# DLLVM_ENABLE_PROJECTS="clang;openmp" OpenMP не является обязательным, но во многих случаях приложения используют его# DLLVM_TARGETS_TO_BUILD Ускорьте компиляцию, создав только необходимую цель хоста ЦП# CMAKE_INSTALL_PREFIX Где установить сборку LLVMcmake -S llvm -B -DCMAKE_BUILD_TYPE=Выпуск -DLLVM_ENABLE_PROJECTS="clang;openmp" -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_INSTALL_PREFIX=$HOME/local/llvm-17 make -C build -j8 все установить
Драйвер OpenCL 2.0 или 3.0, поддерживающий как минимум следующие функции:
Общая виртуальная память с грубым буфером (SVM)
Вход СПИР-В
Общее адресное пространство
Переменные области программы
В зависимости от скомпилированного приложения CUDA/HIP могут потребоваться дополнительные расширения или функции OpenCL. Например, для поддержки примитивов деформации драйвер OpenCL должен также поддерживать дополнительные функции подгрупп, такие как перемешивание, голосование и cl_intel_required_subgroup_size.
Intel Compute Runtime или oneAPI
Загрузчик нулевого уровня oneAPI
Для совместимости HIP-SYCL и HIP-MKL: oneAPI.
Вы можете скачать и распаковать последний выпущенный исходный пакет или клонировать ветку разработки через git. Мы стремимся поддерживать стабильность main
ветки разработки, но в ходе цикла разработки у нее могут возникнуть проблемы со стабильностью.
Чтобы клонировать исходники из Github:
git клон https://github.com/CHIP-SPV/chipStar.gitcd чипStar Обновление подмодуля git --init --recursive
mkdir build && cd build# LLVM_CONFIG_BIN является необязательным, если LLVM можно найти в PATH или если не используется двоичный файл с указанием версии# (например, llvm-config-17)cmake .. -DLLVM_CONFIG_BIN=/путь/к/llvm-config -DCMAKE_INSTALL_PREFIX=/путь/к/установке заставить все build_tests установить -j8
| Вы также можете скомпилировать и установить hipBLAS, добавив -DCHIP_BUILD_HIPBLAS=ON
ПРИМЕЧАНИЕ. Если у вас нет libOpenCL.so (например, из пакета ocl-icd-opencl-dev
), а установлен только libOpenCL.so.1, CMake не сможет его найти и отключает серверную часть OpenCL. Эта проблема описывает обходной путь.
Чтобы собрать чипStar для использования с графическим процессором ARM Mali G52, выполните следующие действия:
создайте LLVM и SPIRV-LLVM-Translator, как описано выше.
собрать чипStar с опцией -DCHIP_MALI_GPU_WORKAROUNDS=ON cmake
Есть некоторые ограничения: ядра, использующие двойной тип, не будут работать, а ядра, использующие подгруппы, могут не работать.
Обратите внимание, что ChipStar использует собственную реализацию OpenCL, предоставленную ARM. Нам удалось успешно скомпилировать и запустить ChipStar на устройстве Odroid N2 с использованием Ubuntu 22.04.2 LTS и версии драйвера OpenCL 3.0 v1.r40p0-01eac0.
Чтобы создать чипStar для использования с графическим процессором PowerVR, можно выполнить шаги по умолчанию. Для решения проблемы в реализации PowerVR OpenCL применяется автоматическое решение.
Существуют некоторые ограничения: ядра, использующие двойной тип, не будут работать, ядра, использующие подгруппы, могут не работать, вы также можете столкнуться с неожиданными ошибками OpenCL, такими как CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST и другими проблемами.
Обратите внимание, что ChipStar использует собственную реализацию OpenCL, предоставленную Imagination Technologies. Нам удалось успешно скомпилировать и запустить чипStar на устройстве VisionFive2, используя предварительно созданный образ Debian VisionFive2 202403, версию драйвера 1.19. Для других SBC могут потребоваться дополнительные обходные пути.
Существует скрипт check.py
, который можно использовать для запуска модульных тестов и который отфильтровывает известные неудачные тесты для разных платформ. Его использование заключается в следующем.
BUILD_DIR={путь к каталогу сборки. Убедитесь, что цель build_tests построена} БЭКЭНД={opencl/level0} ^ Какой сервер/драйвер/платформу вы хотите протестировать: «opencl» = среда выполнения Intel OpenCL, «level0» = среда выполнения Intel LevelZero DEVICE={cpu,igpu,dgpu,pocl} # Какое устройство тестировать.^ Выбирает ожидаемые списки пройденных тестов. «igpu» — это iGPU Intel Iris Xe, «dgpu» — типичный последний dGPU Intel, такой как серия Data Center GPU Max или Arc.export. CHIP_PLATFORM=N # Если в системе присутствует несколько платформ OpenCL, выбирает, какую из них использовать. .Вы всегда можете проверить, какое устройство используется ChipStar, выполнив следующие действия: CHIP_LOGLEVEL=info ./build/hipInfo
python3 $SOURCE_DIR/scripts/check.py $BUILD_DIR $DEVICE $BACKEND
Обратитесь к пользовательской документации за инструкциями по использованию установленного чипСтара для создания программ CUDA/HIP.
CHIP_BE=<opencl/level0> # Выбирает серверную часть для использования. Если доступны и Level Zero, и OpenCL, по умолчанию используется Level Zero.CHIP_PLATFORM=<N> # Если в системе присутствует несколько платформ, выбирает, какую из них использовать. По умолчанию 0CHIP_DEVICE=<N> # Если в системе присутствует несколько устройств, выбирает, какое из них использовать. По умолчанию 0CHIP_DEVICE_TYPE=<gpu/cpu/accel/fpga> или пусто # Выбирает тип устройства для использования. По умолчанию пусто.CHIP_LOGLEVEL=<trace/debug/info/warn/err/crit> # Устанавливает уровень журнала. При компиляции в RELEASE доступны только ошибки/критические ошибкиCHIP_DUMP_SPIRV=<ON/OFF(default)> # Сбрасывает сгенерированный код SPIR-V в файлCHIP_JIT_FLAGS=<flags> # Дополнительные флаги JITCHIP_L0_COLLECT_EVENTS_TIMEOUT=<N(по умолчанию 30 с)> # Таймаут в секунд для сбора нулевого уровня eventCHIP_L0_EVENT_TIMEOUT=<N(по умолчанию 0) # Тайм-аут в секундах, определяющий, как долго нулевой уровень должен ждать события до истечения времени CHIP_SKIP_UNINIT=<ON/OFF(default)> # Если включено, пропускает деинициализацию внутренних объектов чипСтара при завершении программыCHIP_MODULE_CACHE_DIR=/ путь/к/желаемому/каталогу # Каталог кэша модуля/программы. По умолчанию $HOME/.cache/chipStar, если кэширование нежелательно, установите пустую строку, т.е. экспортируйте CHIP_MODULE_CACHE_DIR=
Пример:
╭─pvelesko@cupcake ~╰─$ clinfo -l Платформа № 0: Графика Intel(R) OpenCL `-- Устройство № 0: Графика Intel(R) Arc(TM) A380 Платформа № 1: Графика Intel(R) OpenCL `-- Устройство № 0: Intel(R) UHD Graphics 770
Основываясь на этих значениях, если мы хотим работать на OpenCL iGPU:
экспорт CHIP_BE=openclexport CHIP_PLATFORM=1экспорт CHIP_DEVICE=0
ПРИМЕЧАНИЕ. Level Zero не имеет эквивалента clinfo. Обычно, если у вас более одного устройства нулевого уровня, будет только одна платформа, поэтому установите CHIP_PLATFORM=0, а затем CHIP_DEVICE для устройства, которое вы хотите использовать. *Вы можете проверить имя устройства, запустив образец, который печатает имя, например build/samples/0_MatrixMultiply/MatrixMultiply
Это часто происходит, когда последняя установленная версия GCC не включает libstdc++, а Clang++ по умолчанию все равно выбирает последнюю найденную версию и в конечном итоге не может связать программы C++. Проблема обсуждается здесь.
Эту проблему можно решить, определив файл конфигурации Clang++, который заставляет GCC выполнять то, что мы хотим. Пример:
echo --gcc-install-dir=/usr/lib/gcc/x86_64-linux-gnu/11 > ~/local/llvm-17/bin/x86_64-unknown-linux-gnu-clang++.cfg
При запуске тестов на устройствах OpenCL, которые не поддерживают числа с плавающей запятой двойной точности, будет несколько тестов, которые выдадут ошибку.
Возможно, можно включить программную эмуляцию чисел с плавающей запятой двойной точности для iGPU Intel, установив две переменные среды, чтобы ядра, использующие двойные значения, работали, но с большими накладными расходами, связанными с программной эмуляцией:
экспорт IGC_EnableDPEmulation=1export OverrideDefaultFP64Settings=1
Если ваше устройство не поддерживает эмуляцию, вы можете пропустить эти тесты, указав опцию -DSKIP_TESTS_WITH_DOUBLES=ON
во время настройки cmake.