Я хочу многопоточно использовать алгоритм «грубой силы».Многопоточный расчет по отсортированным комбинациям алфавита в C
У меня есть функция bool check(const char *s, size_t n)
, которая проверяет, является ли строка s
размером n
паролем или нет.
Эта функция вызывается для всех комбинаций строк, которые возможны с моим алфавитом (около 90 символов в алфавите).
Я был в состоянии сделать это в одном потоке, но теперь я хочу его многопоточно. Я также хочу, чтобы мои потоки к каждому имели почти такое же количество работы. Я не хочу, чтобы один поток должен был тестировать 1B комбинации, а другой только 1k).
Я думал о разделении нагрузки на «партии» комбинаций. Каждая партия будет иметь индекс start
и индекс stop
, поэтому нить, имеющая пакет, должна проверять все комбинации между start
и stop
.
То, что я называю индекс комбинации является лексикографическое индекс, например, с алфавитом [A, B, C]:
index combination
1 A
2 B
3 C
4 AA
5 AB
6 AC
7 BA
8 BB
... ...
Например, поток, который будет назначен пакет с start=4
и stop=7
будет тестировать комбинации AA, AB, AC, BA
.
Как легко сгенерировать комбинации для партии в потоке? Приоритет заключается в том, чтобы он был быстрым, поскольку весь пункт программы является грубым принуждением.
Есть ли еще один быстрый способ разделить работу между потоками?
Я мог бы предложить делить стартовые символы среди множества потоков, равных, как многие логические ядра, которые у вас есть, во избежание каких-либо перераспределений на основе контекста. – Nic
@Nic на самом деле, как я понимаю, как работают современные конвейерные процессоры, быть значительными преимуществами, имея больше потоков, чем ядра. Но не будем спорить об этом здесь, потому что это другой вопрос, подходящий для другого вопроса и ответа. –
Похоже, есть хороший ответ здесь: http://stackoverflow.com/a/24716319/4126177 :) –