Какой эффективный способ добавить многопоточность к этому простому алгоритму?
Я бы сказал, что мои знания в C честны, и я хотел бы расширить программу, чтобы расширить мои знания в области параллельного программирования.
По сути, это программа, к которой я обращаюсь, это генератор грубой силы для увеличения с помощью паролей, таких как 0000 .. zzzz определенного набора символов: нужна помощь с кодом грубой силы для crypt(3)
Алгоритм изложен ниже (за это спасибо Джерому)
int len = 3;
char letters[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
int nbletters = sizeof(letters)-1;
int main() {
int i, entry[len];
for(i=0 ; i<len ; i++) entry[i] = 0;
do {
for(i=0 ; i<len ; i++) putchar(letters[entry[i]]);
putchar('\n');
for(i=0 ; i<len && ++entry[i] == nbletters; i++) entry[i] = 0;
} while(i<len);
}
Каким логичным образом вы можете сказать, что это можно расширить с помощью многопоточности?
CUDA - глупое, но простое решение. Я слышал об OpenMP, который в моих книгах выглядит как хорошее решение. Как вы думаете, как это можно разделить, чтобы извлечь выгоду из нескольких ядер моего компьютера? Т.е. ядро 1 вычисляет aaaa..ffff, а ядро 2 вычисляет ffff... zzzz, это единственный метод, который имеет смысл с этим?
2 ответа
Я думаю, что вы ответили на свой вопрос. Aaaa..ffff в потоке #1 и ffff..zzzz в потоке #2 - это, вероятно, верный путь, за исключением того, чтобы разбить его на несколько потоковых частей, если у вас есть больше доступных ядер. Попытка запустить поток для выполнения некоторой части цикла do, вероятно, привнесет больше издержек, чем пользы в таком строгом алгоритме.
Я предполагаю, что вы хотите видеть выходные символы в том порядке, в котором они указаны в entry
массив.
Это последовательная операция, вы не можете распараллелить ее.
Редактировать:
Хорошо, теперь я вижу, насколько неправильным был мой:) На самом деле вы МОЖЕТЕ распараллелить эту программу, но вам нужно реализовать дополнительный слой, обрабатывающий порядок букв в выводе. Также необходимо реализовать синхронизацию.