Как попасть в кеш текселя в WebGL? - PullRequest
0 голосов
/ 11 октября 2018

Что я делаю, так это GPGPU в WebGL, и я не знаю, какая схема доступа, о которой я буду говорить, применима к обычным графическим и игровым программам.В нашем коде часто встречаются данные, которые необходимо суммировать или сокращать для каждого выходного текселя.Очень простой пример - матричное умножение, во время которого для каждого выходного текселя вы возвращаете значение, которое является точечным произведением строки одного входа и столбца другого ввода.

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

Я буду описывать некоторые предположения и некоторые схемы ниже.Пример кода для всего этого находится под https://github.com/jeffsaremi/webgl-experiments К сожалению, из-за размера я не смог использовать функцию «сниппет» в StackOverflow.ПРИМЕЧАНИЕ. Все примеры записывают в консоль, а не в html-страницу.

  1. Реализация базовых матемул: Пример: [2,3] x [3,4] -> [2,4].Это дает в упрощенной форме 2 текстуры (w: 3, h: 2) и (w: 4, h: 3).Для каждого выходного текселя я буду читать по оси X левой текстуры, но по оси Y правой текстуры.(см. webgl-matmul.html)

  2. Предполагая, что GPU обращается к данным, аналогичным ЦП - то есть блок за блоком - если я читаю по ширине текстуры, я должен ударитькеш довольно часто.Для этого я бы расположил обе текстуры таким образом, чтобы я делал точечные продукты только для соответствующих строк (по ширине текстуры).Пример: [2,3] x [4,3] -> [2,4].Обратите внимание, что данные для правой текстуры теперь транспонируются так, чтобы для каждого выходного текселя я делал точечное произведение из одной строки слева и одной строки справа.(см. webgl-matmul-shared-наряду с X.html)

  3. Чтобы убедиться, что приведенное выше предположение действительно работает, я также создал отрицательный тест.В этом тесте я буду читать по оси Y как левой, так и правой текстур, которые должны иметь наихудшую производительность.Данные предварительно транспонированы, так что результаты имеют смысл.Пример: [3,2] x [3,4] -> [2,4].(см. webgl-matmul-shared-наряду с Y.html.)существование или отсутствие такого поведения кэширования.Вам нужно выполнить каждый пример несколько раз, чтобы получить согласованные результаты для сравнения.

    Затем я пришел к этому документу http://fileadmin.cs.lth.se/cs/Personal/Michael_Doggett/pubs/doggett12-tc.pdf, в котором кратко утверждается, что GPU кэширует данные в блоках (или тайлах, как яназовите их).

    Основываясь на этом многообещающем отведении, я создал версию matmul (или точечного произведения), в которой для вычисления используются блоки 2x2.Прежде чем использовать это, конечно, мне пришлось переставить свои входы в такой макет.Стоимость этой перестановки не включена в мое сравнение.Допустим, я мог сделать это один раз и запустить мой матемул много раз после.Даже эта схема ничего не внесла в представление, если не отняла.(см. webgl-dotprod-tiled.html).

    На данный момент у меня совершенно нет идей, и любые советы будут оценены.спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...