Распараллеливание цикла for с использованием pthreads - PullRequest
0 голосов
/ 01 марта 2011
void rijndael_enc(RIJNDAEL_context *ctx,  
       UINT8 *input, int inputlen, UINT8 *output)
{ 
int i, nblocks; 
nblocks = inputlen / RIJNDAEL_BLOCKSIZE; 
for (i = 0; i<nblocks; i++) 
{ 
rijndael_encrypt(ctx, input, output); 
input+= RIJNDAEL_BLOCKSIZE; 
output+= RIJNDAEL_BLOCKSIZE; 
}

Я хотел бы выполнить это для цикла параллельно (используя pthreads ..), т.е. каждый блок выполняется потоком, а количество потоков = nblocks.Я не уверен, как поступить .. Поместит ли мьютекс до того, как будет увеличен ввод и вывод, сделайте трюк?

1 Ответ

2 голосов
/ 01 марта 2011

Запуск потока в каждом блоке, вероятно, не является правильным подходом - создание и уничтожение потоков является дорогостоящей операцией (насколько многое зависит от операционной системы).

Такая стратегия может сработать:

  • определяет, сколько всего блоков необходимо зашифровать
  • определяет, сколько потоков вы хотите использовать

Это даст вам количество блоков, которое должен обработать каждый поток.Затем вы должны обработать первые n блоков с потоком один, следующие n блоков с потоком 2 и т. Д. *

Аргументы, которые поток получит при запуске, могут быть просто:

  • смещение во входной буфер для чтения из
  • смещение в выходной буфер для записи в
  • количество блоков, которые он должен обработать

Как только все потоки запущены, ваш основной поток долженприсоединяйтесь ко всем рабочим потокам, и все готово.

Поскольку все потоки будут работать в разных областях памяти, вам не нужно беспокоиться о синхронизации между этими доступами.

Однако здесь есть одна загвоздка: если ваш ввод не кратен размеру блока, последний блок, вероятно, нужно обрабатывать с осторожностью (заполнение).В этом случае я бы посоветовал разобраться с последним блоком в главном потоке, прежде чем ждать окончания рабочих.

Как сказано в комментариях, в большинстве случаев следует избегать ЕЦБ.Поскольку это для образовательных целей, то проблем нет.Предложение: как только вы начнете работать с ECB, возможно, попробуйте что-нибудь в режиме CTR (который также можно распараллелить)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...