2012-01-04 8 views
3

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

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

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

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

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

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

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

Любые советы?

ответ

0

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

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

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

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

+0

К сожалению, да, мне нужно проанализировать два вектора друг против друга «целое» после получения результата. (Для расчета корреляции.) Точки данных являются двойной точностью, хотя это необязательно. 32-бит, вероятно, даст мне достойные результаты. Это правда, что память не дорогая, но я действительно не знаю, как в CUDA или OpenCL (либо все в порядке) вы можете выделить эту память. Из того, что я понимаю, модель памяти сложнее, чем просто «malloc'ing», что вам нужно, но я мог ошибаться. Вот почему я спрашиваю :) – Steve

+0

Я должен разъяснить свои заботы о памяти: я не беспокоюсь о том, чтобы установить 120 000 точек в 1 ГБ. (120000x8 = 0,0009 ГБ). Скорее, я беспокоюсь о том, что вы запускаете этот алгоритм тысячи раз одновременно, и каждый из них требует одинакового объема памяти, в то же время. В любом случае, я думаю, это одна из тех вещей, которые мне просто нужно будет попробовать. Даже если я могу делать только сотни одновременно, это будет огромным ускорением, поэтому это может стоить того. – Steve