LINUX.ORG.RU

История изменений

Исправление vitalif, (текущая версия) :

Именно что ваще всё выбросили. Погугли, есть документ открытый про архитектуру GCN. Очень прикольно сделали и кстати очень похоже на OpenCL :-).

В двух словах: любой GCN GPU состоит из Compute Unit'ов. CU состоит из 4-х векторных ядер по 16 чисел + 1 скалярного ядра. Логически векторные, собственно, работают как 1 на 64 числа. В коде идут вперемешку инструкции для векторных ядер и для скалярного. Ветвления, циклы и т.п. обрабатывает скалярное ядро. Вычисления - векторные. А дальше самый прикол: а как же сделать, скажем if (элемент вектора < 1) { векторные операции } else { другие векторные операции }? А вот как: есть 64-битный регистр-маска выполнения, в который перед телом if загоняется маска, в которой каждый бит равен 1, если тело if должно выполниться для соотв. элемента вектора, и 0, если соответствующую операцию нужно пропустить. Далее для else делается так же, но наоборот. Получается, что с точки зрения векторного процессора ветвления-то и нет, просто сначала одна часть вектора «не вычисляется», а потом другая. :-)

Аналогичными извращениями делаются циклы и т.п., и в этом весь прикол LLVM-бэкенда AMDGPU - нужно генерить такой вот смешанный код, который при этом ещё и за масочками следит.

И вот эти вот CU'шки - они универсальные, т.е. на них и фиксированные функции выполняются, и шейдеры. И в разных GPU их просто разное количество, чем больше CU - тем быстрее :-)

Исправление vitalif, :

Именно что ваще всё выбросили. Погугли, есть документ открытый про архитектуру GCN. Очень прикольно сделали и кстати очень похоже на OpenCL :-).

В двух словах: любой GCN GPU состоит из Compute Unit'ов. CU состоит из 4-х векторных ядер по 16 чисел + 1 скалярного ядра. Логически векторные, собственно, работают как 1 на 64 числа. В коде идут вперемешку инструкции для векторных ядер и для скалярного. Ветвления, циклы и т.п. обрабатывает скалярное ядро. Вычисления - векторные. А дальше самый прикол: а как же сделать, скажем if (элемент вектора < 1) { векторные операции } else { другие векторные операции }? А вот как: есть 64-битный регистр-маска выполнения, в который перед телом if загоняется маска, в которой каждый бит равен 1, если тело if должно выполниться для соотв. элемента вектора, и 0, если соответствующую операцию нужно пропустить. Далее для else делается так же, но наоборот. Получается, что с точки зрения векторного процессора ветвления-то и нет, просто сначала одна часть вектора «не вычисляется», а потом другая. :-)

Аналогичными извращениями делаются циклы и т.п., и в этом весь прикол LLVM-бэкенда AMDGPU - нужно генерить такой вот смешанный код.

И вот эти вот CU'шки - они универсальные, т.е. на них и фиксированные функции выполняются, и шейдеры. И в разных GPU их просто разное количество, чем больше CU - тем быстрее :-)

Исходная версия vitalif, :

Именно что ваще всё выбросили. Погугли, есть документ открытый про архитектуру GCN. Очень прикольно сделали и кстати очень похоже на OpenCL :-).

В двух словах: любой GCN GPU состоит из Compute Unit'ов. CU универсален, состоит из 4-х векторных ядер по 16 чисел + 1 скалярного ядра. Логически векторные, собственно, работают как 1 на 64 числа. В коде идут вперемешку инструкции для векторных ядер и для скалярного. Ветвления, циклы и т.п. обрабатывает скалярное ядро. Вычисления - векторные. А дальше самый прикол: а как же сделать, скажем if (элемент вектора < 1) { векторные операции } else { другие векторные операции }? А вот как: есть 64-битный регистр-маска выполнения, в который перед телом if загоняется маска, в которой каждый бит равен 1, если тело if должно выполниться для соотв. элемента вектора, и 0, если соответствующую операцию нужно пропустить. Далее для else делается так же, но наоборот. Получается, что с точки зрения векторного процессора ветвления-то и нет, просто сначала одна часть вектора «не вычисляется», а потом другая. :-)

Аналогичными извращениями делаются циклы и т.п., и в этом весь прикол LLVM-бэкенда AMDGPU - нужно генерить такой вот смешанный код.

И вот эти вот CU'шки - они универсальные, т.е. на них и фиксированные функции выполняются, и шейдеры. И в разных GPU их просто разное количество, чем больше CU - тем быстрее :-)