Короче говоря, я сделал несколько прототипов интерактивного программного обеспечения. Теперь я использую pygame (python sdl wrapper), и все делается на CPU. Я начинаю переносить его на C сейчас и в то же время искать существующие возможности использовать некоторые возможности графического процессора для включения процессора из избыточных операций. Однако я не могу найти хороший "ориентир", какую точную технологию/инструменты я должен выбрать в своей ситуации. Я просто прочитал множество документов, он очень быстро истощает мои умственные способности. Я не уверен, что это вообще возможно, поэтому я озадачен.
Здесь я сделал очень грубый эскиз моего типичного скелета приложения, который я разрабатываю, но учитывая, что он теперь использует GPU (заметьте, у меня почти нулевые практические знания о программировании GPU). Все еще важно то, что типы данных и функциональность должны быть точно сохранены. Вот он:
Таким образом, F (A, R, P) - это некоторая пользовательская функция, например замещение элемента, повторение и т.д. Функция, по-видимому, постоянна в времени жизни программы, формы прямоугольника обычно не равны с формой A, расчет места. Поэтому они просто генерируются с моими функциями. Примеры F: повторять строки и столбцы A; подставлять значения со значениями из таблиц замещения; составьте некоторые плитки в один массив; любая математическая функция для значений A и т.д. Как сказано, все это можно легко сделать на CPU, но приложение должно быть действительно гладким. BTW в чистом Python стал просто непригодным после добавления нескольких визуальных функций, основанных на массивах numpy. Cython помогает делать быстрые пользовательские функции, но тогда исходный код уже является своего рода салатом.
Вопрос:
-
Отражает ли эта схема некоторые (стандартные) технологии /dev.tools?
-
Является ли CUDA тем, что я ищу? Если да, некоторые ссылки/примеры , которые совпадают с с моей структурой приложения, были бы замечательными.
Я понимаю, это большой вопрос, поэтому я расскажу подробнее, если это поможет.
Обновить
Вот конкретный пример двух типичных вычислений для моего прототипа редактора растровых изображений. Поэтому редактор работает с индексами, а данные включают слои с соответствующими битовыми масками. Я могу определить размер слоев и масок того же размера, что и слои, и, скажем, все слои имеют одинаковый размер ( 1024 ^ 2 пикселя= 4 МБ для 32-битных значений). И моя палитра говорит: 1024 элемента (4 Килобита для 32-битного формата).
Подумайте, что я хочу сделать сейчас две вещи:
Шаг 1. Я хочу сгладить все слои в одном. Скажем, A1 - слой по умолчанию (фон), а слои "A2" и "A3" имеют маски "m2" и "m3". В python я бы написал:
from numpy import logical_not
...
Result = (A1 * logical_not(m2) + A2 * m2) * logical_not(m3) + A3 * m3
Поскольку данные независимы, я считаю, что он должен давать ускорение пропорционально количеству параллельных блоков.
Шаг 2. Теперь у меня есть массив и вы хотите "раскрасить" его с помощью некоторой палитры, так что это будет моя таблица поиска. Как я вижу сейчас, существует проблема с одновременным чтением элемента таблицы поиска.
Но моя идея: возможно, можно просто дублировать палитру для всех блоков, чтобы каждый блок мог читать свою собственную палитру? Как это: