使用pthreads并行化for循环

时间:2011-03-01 12:11:27

标签: dependencies for-loop pthreads

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 个答案:

答案 0 :(得分:2)

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

这样的策略可行:

  • 确定您需要加密的总块数
  • 确定要使用的线程数

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

线程在启动时会收到的参数可以是:

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

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

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

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

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