【问题标题】:Parallelization of a for loop using pthreads使用 pthread 并行化 for 循环
【发布时间】:2011-03-01 12:11:27
【问题描述】:
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; 
}

我想并行执行这个 for 循环(使用 pthreads..),即每个块都由一个线程执行,线程数 = nblocks。我不知道如何继续..在输入和输出增加之前放置一个互斥锁是否有用?

【问题讨论】:

  • 这看起来像 ECB 模式加密,你应该避免这种情况。有关图形说明,请参阅 wikipedia
  • 是的,它是 ECB 模式……我知道不建议这样做……这仅用于教育目的……我以前在这种情况下使用过 Open MP,但我不确定如何使用 pthreads..in OpenMP 我会使用#pragma omp for

标签: dependencies for-loop pthreads


【解决方案1】:

每个块启动一个线程可能不是正确的方法 - 创建和销毁线程是一项昂贵的操作(多少很大程度上取决于操作系统)。

这样的策略可以奏效:

  • 确定总共需要加密多少块
  • 确定要使用的线程数

这将为您提供每个线程应处理的块数。 然后,您将使用线程 1 处理前 n 个块,使用线程 2 处理接下来的 n 个块,等等...

线程启动时接收的参数可以是:

  • 要读取的输入缓冲区的偏移量
  • 要写入的输出缓冲区的偏移量
  • 它应该处理的块数

一旦所有线程都启动,您的主线程应该加入所有工作线程,您就可以开始了。

由于所有线程都会在不同的内存区域上运行,因此您无需担心这些访问之间的同步。

但有一个问题:如果您的输入不完全是块大小的倍数,则可能需要小心处理最后一个块(填充)。在这种情况下,我建议在等待工作人员完成之前处理主线程中的最后一个块。

正如 cmets 中所说,在大多数情况下应避免使用欧洲央行。由于这是出于教育目的,所以没问题。 建议:一旦你为 ECB 工作,也许可以在 CTR 模式下尝试一些东西(也可以并行化)?

【讨论】:

  • 感谢您的回答..要使用的线程数是否取决于机器中的内核数?..我有一台有 8 个内核的机器,所以 8 是一个合理的线程数有?此外,我如何填充最后一个块(AES 中的块大小为 128 位)
  • 最佳数量很大程度上取决于机器架构,以及您如何实现实际的加密代码。 (使用特殊指令集、硬件加密加速……)。您必须进行试验以确定最佳比例。我在上面链接的维基百科上的文章有关于填充的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多