параллельная обработка нескольких оценок последовательной задачи для большого набора данных - задача для вычислений на GPU? - PullRequest
3 голосов
/ 04 января 2012

Я работаю над кодом обработки сигналов в SciPy и сейчас пытаюсь использовать числовой оптимизатор для его настройки.К сожалению, с течением времени этот процесс оказывается довольно медленным.

Операции, которые я должен выполнить для этой оптимизации, следующие:

  • Загрузка большого 1-d файл данных (~ 120000 точек)
  • Запустить оптимизатор, который:
    • Выполняет операцию обработки сигнала, не изменяет исходные данные, создает 120000 новых точек данных.
    • Проверяетразница между исходным сигналом и новым сигналом с использованием различных операций,
      • Одна из которых включает в себя свертку на основе БПФ
      • Генерирует единственное значение «ошибки» для суммирования результата - это то, что следует минимизировать
    • Просмотр ошибок и повторный запуск работы с различными параметрами

Функции обработки сигналов и ошибок занимают менее 3 секунд, нок сожалению, 50000 раз занимает намного больше времени.Я экспериментирую с различными более эффективными алгоритмами оптимизации, но независимо от того, что это займет тысячи итераций.

Я распараллелил пару оптимизаторов, которые я пробую, используя потоки процессора, что было не слишком сложно.так как оптимизатор может легко выполнить несколько запланированных запусков одновременно в отдельных потоках, используя ThreadPool.map.

Но на моем ноутбуке это примерно в 2 раза больше, а на многоядерном компьютере - в 8 раз.У меня вопрос, это приложение, для которого я мог бы использовать обработку GPU?Я уже перевел некоторые части кода на C, и я мог бы представить использование OpenCL для создания функции из массива параметров в массив значений ошибок и выполнения этого сотни раз за раз.- Даже если он выполняет последовательную обработку медленно, получение всех результатов за один снимок было бы удивительным.

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

Любой совет?

1 Ответ

0 голосов
/ 04 января 2012

Вам нужно набрать все 120000 новых очков, прежде чем анализировать разницу?Не могли бы вы рассчитать новую точку, а затем решить для этой точки, сходитесь ли вы?

Насколько велики точки?Сегодня графическая карта стоимостью 50 долларов имеет 1 ГБ памяти - должно хватить на 120 тысяч очков.Я не так хорошо знаком с openCL, как Cuda, но могут быть ограничения на объем памяти текстур по сравнению с общей памятью и т. Д.

edit: более знаком с CUDA, чем с OpenCL, но это, вероятно, относится к обоим.
Память на графических процессорах немного сложнее, но очень гибкая, у вас есть текстурная память, которая может быть прочитана ядром графического процессора, и некоторые очень умные функции кэширования, позволяющие очень быстро получить доступ к значениям в 2-мерном и 3-м массивах.Имеется память openGL, в которую можно записывать данные для отображения, и кэш-память в каждом потоке ограничена (16-64 КБ?)

Хотя передача из основной памяти в графический процессор относительно медленная (несколько ГБ / с), внутренняяшина памяти на видеокарте в 20 раз быстрее этой

...