Какой эффективный способ добавить многопоточность к этому простому алгоритму?

Я бы сказал, что мои знания в 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 массив.

Это последовательная операция, вы не можете распараллелить ее.

Редактировать:

Хорошо, теперь я вижу, насколько неправильным был мой:) На самом деле вы МОЖЕТЕ распараллелить эту программу, но вам нужно реализовать дополнительный слой, обрабатывающий порядок букв в выводе. Также необходимо реализовать синхронизацию.

Другие вопросы по тегам