Короче говоря, я сделал несколько прототипов интерактивного программного обеспечения. Теперь я использую pygame (python sdl wrapper), и все делается на CPU. Я начинаю переносить его на C сейчас и в то же время искать существующие возможности использовать некоторые возможности графического процессора для включения процессора из избыточных операций. Однако я не могу найти хороший «ориентир», какую точную технологию/инструменты я должен выбрать в своей ситуации. Я просто прочитал множество документов, он очень быстро истощает мои умственные способности. Я не уверен, что это вообще возможно, поэтому я озадачен.
Здесь я сделал очень грубый эскиз моего типичного скелета приложения, который я разрабатываю, но учитывая, что он теперь использует GPU (заметьте, у меня почти нулевые практические знания о программировании GPU). Все еще важно то, что типы данных и функциональность должны быть точно сохранены. Вот оно:
Основное приложение GPU, целочисленные вычисления
Так F (A, R, P) есть некоторая пользовательская функция, например, элемент подстановки, повторение и т.д. Функция предположительно постоянной в жизни программы, формы прямоугольника, как правило, не равны с A формы, поэтому он не выполняется на месте. Поэтому они просто генерируются с моими функциями. Примеры F: повторять строки и столбцы A; подставлять значения со значениями из таблиц замещения; составьте некоторые плитки в один массив; любая математическая функция для значений A и т. д. Как сказано, все это можно легко сделать на CPU, но приложение должно быть действительно гладким. BTW в чистом Python стал просто непригодным после добавления нескольких визуальных функций, основанных на массивах numpy. Cython помогает создавать быстрые пользовательские функции, но тогда исходный код уже является своего рода салатом.
Вопрос:
Отражает ли эта схема некоторые технологии (стандарт)/dev.tools?
Является ли CUDA тем, что я ищу? Если да, некоторые ссылки/примеры , которые совпадают с с моей структурой приложения, были бы замечательными.
Я понимаю, это большой вопрос, поэтому я дам более подробную информацию, если это поможет.
Update
Вот конкретный пример двух типичных расчетов для моего прототипа редактора растровых изображений. Поэтому редактор работает с индексами, а данные включают слои с соответствующими битовыми масками. Я могу определить размер слоев и масок того же размера, что и слои, и, скажем, все слои имеют одинаковый размер (1024^2 пикселя = 4 МБ для 32-битных значений). И моя палитра говорит: 1024 элементов (4 килобайта для формата 32 бит/с).
Рассмотрим я хочу сделать две вещи сейчас:
Шаг 1. Я хочу сгладить все слои в одном. Скажем, A1 - слой по умолчанию (фон), а слои «A2» и «A3» имеют маски «m2» и «m3». В питоне я бы написать:
from numpy import logical_not
...
Result = (A1 * logical_not(m2) + A2 * m2) * logical_not(m3) + A3 * m3
Поскольку данные независим я считаю, что это должно дать proportionl для -го ускорения ряда параллельных блоков.
Этап 2. Теперь у меня есть массив и вы хотите «раскрасить» его с помощью некоторой палитры, так что это будет моя таблица поиска.Как я вижу сейчас, существует проблема с одновременным чтением элемента таблицы поиска.
Но моя идея состоит в том, что, возможно, можно просто дублировать палитру для всех блоков, чтобы каждый блок мог читать свою собственную палитру? Пример:
FYI: Существует [Theano] (http://deeplearning.net/software/theano/tutorial/using_gpu.html) (Python), который может использовать графический процессор. Он компилирует символические выражения в код CUDA, который выполняется на вашем графическом процессоре. – displayname
Если есть много независимых данных, проходящих через это (hundeds of MB/s), то это может реально ускорить процесс. Единственная проблема, которую я вижу, заключается в том, что «результирующие прямоугольники могут быть произвольного размера». Я никогда не слышал/не читал о распределении через ядра. Если он известен до начала, это нормально, но массивы должны быть определены до запуска ядра GPU. Так что это в основном зависит от F (как входных, так и выходных) и размера A –
@ blind.wolf Да, размеры известны, он просто не должен иметь ту же форму, что и A, например, в случае масштабирования целочисленного массива. –