Какой эффективный способ добавить многопоточность к этому простому алгоритму? - PullRequest
2 голосов
/ 30 апреля 2011

Я бы сказал, что мои знания в C честны, и я хотел бы расширить программу, чтобы расширить мои знания в области параллельного программирования.

Это, по сути, программа, к которой я обращаюсь, это генератор грубой силы, который увеличивает число паролей, например, от 0000 .. zzzz определенного набора символов: Нужна помощь с кодом грубой силы для склепа (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 ]

3 голосов
/ 30 апреля 2011

Я думаю, что вы ответили на свой вопрос.Aaaa..ffff в потоке # 1 и ffff..zzzz в потоке # 2 - это, вероятно, верный путь, разве что разбить его на несколько потоковых частей, если у вас будет больше ядер.Попытка запустить поток для выполнения некоторой части цикла do, вероятно, привнесет больше издержек, чем пользы в таком строгом алгоритме.

0 голосов
/ 30 апреля 2011

Я предполагаю, что вы хотите видеть выходные символы в порядке , на которые они ссылаются в массиве entry.

Это последовательная операция, которую нельзя распараллелить.

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

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

...