Parallel Thread Execution

Parallel Thread Execution (PTX или NVPTX[1]) — это низкоуровневая виртуальная машина и архитектура набора инструкций для параллельного выполнения потоков, используемая в программной среде CUDA от Nvidia. Компилятор NVCC переводит код, написанный на CUDA, языке, похожем на C++, в инструкции PTX (язык ассемблера, представленный в виде ASCII текста, а графический драйвер содержит компилятор, который переводит инструкции PTX в исполняемый двоичный код[2], который может выполняться на процессорных ядрах GPU от Nvidia. В коллекции компиляторов GNU также есть базовая возможность генерации PTX в контексте оффлоадинга[3] OpenMP. Встроенная сборка PTX может использоваться в CUDA.[4]

Регистры

PTX использует произвольно большой набор регистров; результат работы компилятора почти полностью представляет собой форму с единичным присваиванием, при этом последовательные строки обычно относятся к последовательным регистрам. Программы начинаются с объявлений следующего вида:

.reg .u32 %r<335>; // declare 335 registers %r0, %r1, 
..., %r334 of type unsigned 32-bit integer

Это трёх аргументный ассемблерный язык, и почти все инструкции явно перечисляют тип данных (с учётом знака и ширины), на которых они оперируют. Названия регистров предваряются символом %, а константы являются литералами, например:

shr.u64 %rd14, %rd12, 32; // shift right an unsigned 64-bit integer from %rd12 by 32 positions, result in %rd14 cvt.u64.u32 %rd142, %r112; // convert an unsigned 32-bit integer to 64-bit

Есть регистры предикатов, но скомпилированный код в шейдерной модели 1.0 использует их только в сочетании с командами ветвления; условное ветвление это:

@%p14 bra $label; // branch to $label

Инструкция setp.cc.type устанавливает предикатный регистр равным результату сравнения двух регистров соответствующего типа. Также существует инструкция set, где set.le.u32.u64 %r101, %rd12, %rd28 устанавливает 32-битный регистр %r101 в значение 0xffffffff, если 64-битный регистр %rd12 меньше или равен 64-битному регистру %rd28. В противном случае %r101 устанавливается в 0x00000000.

Есть несколько предопределенных идентификаторов, которые обозначают псевдорегистры. В частности, %tid, %ntid, %ctaid и %nctaid содержат, соответственно, индексы потоков, размеры блоков, индексы блоков и размеры сетки.

Пространстве состояний

Команды загрузки (ld) и сохранения (st) относятся к одному из нескольких различных пространств состояний (банков памяти), например ld.param. Существует восемь пространств состояний:[5].

.reg
регистры
.sreg
специальные, только для чтения, специфичные для платформы регистры
.const
общая, только для чтения память
.global
глобальная память, общая для всех потоков
.local
локальная память, приватная для каждого потока
.param
параметры, передаваемые в ядро
.shared
память, общая между потоками в блоке
.tex
глобальная текстурная память (устарела) Общая память объявляется в PTX файле посредством строк в начале следующего вида:
.shared .align 8 .b8 pbatch_cache[15744]; // define 15,744 bytes, aligned to an 8-byte boundary
Написание ядер на PTX требует явной регистрации модулей PTX через API драйвера CUDA, что обычно бывает более громоздким, чем использование API времени выполнения CUDA и компилятора CUDA от Nvidia, nvcc. Проект GPU Ocelot предоставлял API для регистрации модулей PTX наряду с вызовами ядер API времени выполнения CUDA, хотя проект GPU Ocelot более не поддерживается активно.[6]

См. также

Ссылки

Примечания

  1. [Cite web|url=https://llvm.org/docs/NVPTXUsage.html%7Ctitle=User Guide for NVPTX Back-end — LLVM 18.0.0git documentation|website=llvm.org|access-date=2023-12-27 «User Guide for NVPTX Back-end — LLVM 7 documentation»]
  2. 1. Overview — cuda-binary-utilities 12.3 documentation. docs.nvidia.com. Дата обращения: 27 декабря 2023. Архивировано 1 января 2024 года.
  3. nvptx - GCC Wiki. gcc.gnu.org. Дата обращения: 27 декабря 2023. Архивировано 30 сентября 2023 года.
  4. 1. Using Inline PTX Assembly in CUDA — Inline PTX Assembly in CUDA 12.3 documentation. docs.nvidia.com. Дата обращения: 27 декабря 2023. Архивировано 27 декабря 2023 года.
  5. CUDA Toolkit Documentation 12.3 Update 1. docs.nvidia.com. Дата обращения: 27 декабря 2023. Архивировано 27 декабря 2023 года.
  6. gtcasl/gpuocelot. — 2023-12-27. Архивировано 24 сентября 2023 года.

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.