2016-11-07 24 views
-1

Я прошу для посоветуете для следующей задачи:GPU Brute-Force Реализация

для исследования-проекта я пишу алгоритм перебора на основе GPU с (Py) OpenCL.

(я знаю JTR это там)

Прямо сейчас у меня есть Brute-Force-генератор в Python, который заполняется для каждого раунда буфера со словами (количество = 1024 * 64) .I проход буфер для ядра GPU. GPU вычисляет для каждого значения в буфере значение хеша MD5 и сравнивает его с заданным. Отлично, что он работает!

НО:

Я не думаю, что это на самом деле полная производительность я могу получить от ГПУ - или это? Не существует ли узкое место, когда я должен заполнить буфер процессором и передать его на графический процессор «просто» для вычисления Hash-сравнения - или я ошибаюсь, и это уже быстрый или почти быстрый результат, который я могу получить?

Я проделал много исследований, прежде чем рассмотреть этот вопрос здесь. До сих пор я не мог найти реализацию грубой силы на ядре GPU - почему?

Thx

EDIT 1:

Я пытаюсь объяснить это по-другому, что я хочу знать. Допустим, у меня средний компьютер. Выполнение алгоритма грубой силы на графическом процессоре выполняется быстрее, чем на CPU (если вы делаете это правильно). Я просмотрел некоторые инструменты грубой силы GPU и не смог найти его со всей реализацией грубой силы на ядре GPU.

Прямо сейчас я передаю «пакеты слов» на GPU и позволяю им выполнять работу (хеш & сравнить) там - похоже, что это общий путь. Разве не быстрее «разбить» алгоритм грубой силы, так что каждый блок на графическом процессоре сам создаст собственные «пакеты слов».

Все, что я делаю, задается вопросом, почему общим способом является передача пакетов со значениями от CPU к графическому процессору вместо того, чтобы работать с ЦП также на графическом процессоре! Это из-за того, что невозможно разбить алгоритм грубой силы на графическом процессоре или не стоит ли улучшать усилия по переносу его на GPU?

ответ

1

Об эффективности подхода «грубой силы».

Все, что я сделать, это интересно, почему распространенный способ передать пакеты со значениями от процессора к GPU вместо того, чтобы делать работу процессора и на работе GPU! Это из-за того, что невозможно разбить алгоритм грубой силы на графическом процессоре или не стоит ли улучшать усилия по переносу его на GPU?

Я не знаю деталей вашего алгоритма, но, в общем, есть несколько моментов, которые необходимо рассмотреть перед созданием гибридного алгоритма CPU-GPU. Просто назовите несколько:

  • Различные архитектуры (лучший алгоритм CPU, вероятно, не самый лучший алгоритм GPU).
  • Дополнительные точки синхронизации.
  • Различные пространства памяти (подразумеваются PCIe/сетевые передачи).
  • Более сложные алгоритмы

  • Более сложная тонкая настройка.

  • Vendors policy.

Тем не менее, существует немало примеров, которые сочетают в себе мощность графического процессора и процессора одновременно. Как правило, на процессоре будут выполняться последовательные или сильно расходящиеся части алгоритма, а на графическом процессоре выполняется однородная, интенсивная вычислительная часть. Другие приложения используют процессор для предварительной обработки входных данных в формате, который более подходит для обработки графических процессоров (например, при изменении формата данных). Наконец, есть приложения, ориентированные на чистую производительность, которые действительно выполняют значительную работу над процессором, например, проект MAGMA.

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

О выполнении текущего подхода

Я думаю, что вы должны сломать свой вопрос в двух частях:

  • Это мое ядро ​​GPU эффективным?
  • Сколько времени я делаю на графическом процессоре?

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

  1. ли ваш расчет памяти/вычислить границы?
  2. Насколько вы далеко от пропускной способности пиковой памяти GPU?

Вам необходимо начать с этого вопроса, чтобы узнать, какую оптимизацию/алгоритм вы должны применять. Взгляните на roofline performance model.

Что касается второго вопроса, хотя вы не вдаетесь в детали, кажется, что ваше приложение тратит столько времени на небольшие передачи памяти (посмотрите на это article о том, как оптимизировать передачу памяти). Накладные расходы на запуск PCIe просто для отправки нескольких слов убьют любое преимущество в производительности, которое вы получите от использования устройства GPU. Таким образом, отправка буфера небольших буферов вместо больших блоков упаковки памяти, большая их часть, в общем, не способ.

Если вы ищете производительность, возможно, вам захочется совместить вычисления и передачу памяти. Прочтите this article для получения дополнительной информации.

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

+0

Thx для вашего времени! Я обновил свой вопрос, возможно, вы могли бы снова взглянуть на него и сообщить мне, что вы думаете об этом. Мой вопрос не является явным о моей программе и моей производительности - это больше об общей реализации алгоритма GPU с грубой силой. – tobnic

+0

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