iOS — транспонирование матриц с ускорением на GPU, умножение и дилемма собственного разложения

Я работаю над библиотекой, которая требует использования векторов и матриц на платформе iOS. Я решил изучить OpenGLES, потому что манипуляции с матрицами и векторами, которые я планирую выполнять (в основном, транспонирование, умножение матриц и собственное разложение), определенно могут выиграть от ускорения GPU.

Проблема в том, что я не очень хорошо знаком с OpenGLES и, честно говоря, это не лучший вариант. Если бы я использовал OpenGLES, пришлось бы мне вручную писать алгоритмы, которые выполняют транспонирование матриц, умножение и собственное разложение? Или есть другая платформа Apple или стороннего производителя, которая может помочь мне с этими задачами.

Однако основная разделяющая проблема заключается в том, что я хочу, чтобы эти операции ускорялись с помощью графического процессора.


Я собираюсь реализовать свою программу, используя Accelerate Framework и векторизованную арифметику, а затем проверить, достаточно ли быстро для моих целей, а если нет, то попробовать реализацию на GPU.


person Robby Cohen    schedule 29.01.2014    source источник
comment
То, что вы, вероятно, ищете, это openCL. Вам более или менее придется реализовать свои собственные алгоритмы, но это не должно быть сложно перенести из некоторых источников C. Трудно сказать, что кто-то уже сделал то, что вы пытаетесь сделать, поскольку вы получите пользу от графического процессора только в том случае, если вам нужно одновременно выполнять операции с очень большим количеством матриц (1000+ или даже больше). Хотя GLSL (язык шейдеров) включает в себя некоторые базовые операции с матрицами, большая часть работы должна выполняться на ЦП, а для базового рисования вы должны только умножать вектор в вершинном шейдере на одну матрицу.   -  person Matic Oblak    schedule 30.01.2014
comment
Таким образом, если я пытаюсь умножить или разложить очень большие матрицы, подобные тем, которые были обнаружены во время операций Eigenface (матрицы размером порядка wh x wh), я не обязательно выиграю от ускорения графического процессора?   -  person Robby Cohen    schedule 30.01.2014


Ответы (2)


Как утверждает комбинатор, Accelerate использует SIMD для ускорения многих своих функций, но он основан на процессоре. Для небольших наборов данных это определенно правильный путь, но работа на GPU может значительно превзойти его для достаточно больших наборов данных с легко распараллеливаемыми операциями.

Чтобы не писать весь код взаимодействия OpenGL ES самостоятельно, вы можете взглянуть на мою структуру GPUImage. , который инкапсулирует операции фрагментного шейдера в Objective-C. В частности, вы можете использовать классы GPUImageRawDataInput и GPUImageRawDataOutput для подачи необработанных байтовых данных в графический процессор, а затем обрабатывать их с помощью пользовательского фрагментного шейдера.

Операцию транспонирования матрицы можно было бы реализовать быстро, поскольку все элементы матрицы независимы друг от друга. Умножение матриц на постоянную или небольшую матрицу также было бы достаточно легко сделать, но я не уверен, как правильно масштабировать умножение двух больших матриц. Точно так же у меня нет хорошей реализации собственной декомпозиции, на которую я мог бы сразу же указать.

Недостатком обработки фрагментного шейдера является тот факт, что по умолчанию OpenGL ES принимает и выводит 4-байтовые значения RGBA для каждого пикселя. Вы можете изменить это на половинные числа с плавающей запятой на новых устройствах, и я знаю, что другие сделали это с этой структурой, но я сам не пробовал. Вы можете упаковать отдельные значения с плавающей запятой в байты RGBA и распаковать в конце, что является еще одним подходом к получению этих данных в графическом процессоре и из него.

Поддержка OpenGL ES 3.0 на самых последних устройствах A7 предоставляет некоторые другие возможности для работы с данными с плавающей запятой. Вы можете использовать данные вершины вместо входных данных текстуры, что позволяет вам предоставить четыре числа с плавающей запятой на вершину и извлечь эти числа с плавающей запятой в конце. Бартош Цехановски очень подробно описал это в своем блоге. Это может быть лучшим общим подходом для операций GPGPU, но если вы сможете заставить свои операции работать с текстурными данными во фрагментном шейдере, вы увидите огромное ускорение на новейшем оборудовании (iPhone 5S может быть примерно в 100-1000 раз быстрее, чем iPhone 4 в этом отношении, где обработка вершин и скорость процессора не развивались так быстро).

person Brad Larson    schedule 30.01.2014
comment
Для перестановки и умножения GPU не представляет никакой сложности. Части собственного разложения, однако, чрезвычайно суетливы и вообще не очень хорошо подходят для вычислений на GPU (то есть до тех пор, пока размер матрицы не станет абсолютно огромным). - person Stephen Canon; 31.01.2014
comment
Вероятно, бесполезно пытаться ускорить транспонирование матриц на GPU, поскольку эта операция связана с памятью и не будет иметь никакого ускорения. - person Ciro Santilli 新疆再教育营六四事件ۍ 18.03.2017

Платформа ускорения не ускоряется на GPU, но очень хорошо оптимизирована и использует SIMD на Неон, где это уместно.

person combinatorial    schedule 30.01.2014