Intereting Posts
Влияние режимов отправки на накладные расходы MPI при неблокирующей двухточечной связи Понимание потребности в fflush () и связанных с ней проблемах Почему GLib переопределяет типы? Интеграция OpenSSL и Apple Keychain C char * to int conversion Найти среднее значение, медиана без использования массивов Как сообщить компилятору развернуть этот цикл Что означают два смежных знака фунта в макросе C? Как получить доступ к изображениям Данные из изображения RGB (3-канальное изображение) в opencv Ctrl + D не останавливает выполнение приложения в окне команд Отправка и получение массива символов с использованием трубопровода через argv в C Что ABI, если таковые имеются, ограничивает размер intmax_t? пробел в строке формата (scanf) Целочисленное преобразование (явное и неявное литье) Добавление элемента в n-ое положение путем передачи связанного списка при передаче по ссылке не работает

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

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

Это, по сути, программа, на которую я ссылаюсь, является генератором грубой силы, чтобы увеличивать количество паролей, таких как от 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, который в моих книгах выглядит как хорошее решение, как вы думаете, что это можно разделить, чтобы извлечь выгоду из нескольких ядер моего компьютера? Т.е. kernel ​​1 вычисление aaaa..ffff и вычисление ядра 2 ffff … zzzz, это единственный метод, который имел бы смысл с этим?

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

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

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

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

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