Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependencies 使用pthreads并行化for循环 void rijndael_enc(rijndael_context*ctx, UINT8*输入,int输入,UINT8*输出) { int i,nblocks; nblocks=输入/RIJNDAEL_块大小; 对于(i=0;i_Dependencies_For Loop_Pthreads - Fatal编程技术网

Dependencies 使用pthreads并行化for循环 void rijndael_enc(rijndael_context*ctx, UINT8*输入,int输入,UINT8*输出) { int i,nblocks; nblocks=输入/RIJNDAEL_块大小; 对于(i=0;i

Dependencies 使用pthreads并行化for循环 void rijndael_enc(rijndael_context*ctx, UINT8*输入,int输入,UINT8*输出) { int i,nblocks; nblocks=输入/RIJNDAEL_块大小; 对于(i=0;i,dependencies,for-loop,pthreads,Dependencies,For Loop,Pthreads,每个块启动一个线程可能不是正确的方法-创建和销毁线程是一项昂贵的操作(多少取决于操作系统) 这样的策略可能奏效: 确定总共需要加密多少块 确定要使用的线程数 这将告诉您每个线程应该处理多少块。 然后,您将使用线程1处理前n个块,使用线程2处理下n个块,以此类推 线程启动时将接收的参数可以是: 输入缓冲区中要读取的偏移量 要写入的输出缓冲区中的偏移量 它应该处理的块数 一旦所有线程都启动了,你的主线程应该加入所有的工作线程,你就可以开始了 由于所有线程都会在内存的不同区域上运行,因此不必担

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

这样的策略可能奏效:

  • 确定总共需要加密多少块
  • 确定要使用的线程数
这将告诉您每个线程应该处理多少块。 然后,您将使用线程1处理前n个块,使用线程2处理下n个块,以此类推

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

  • 输入缓冲区中要读取的偏移量
  • 要写入的输出缓冲区中的偏移量
  • 它应该处理的块数
一旦所有线程都启动了,你的主线程应该加入所有的工作线程,你就可以开始了

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

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

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

这看起来像ECB模式加密,您应该避免。请参阅以获取图形解释。是的,这是ECB模式…我知道不建议使用它。这只是出于教育目的。我以前在这种情况下使用过Open MP,但我不确定如何使用pthreads。在OpenMP中,我将使用#pragma omp forthanks作为e回答..要使用的线程数是否取决于机器中的内核数?我有一台有8个内核的机器,那么,8是一个合理的线程数吗?此外,我如何填充最后一个块(AES中的块大小为128位)最佳数量在很大程度上取决于机器体系结构,也取决于您如何实现实际的加密代码(使用特殊指令集、硬件加密加速等)。您必须进行实验以确定最佳比率。上面链接的wiklipedia上的文章中有关于填充的信息。
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; 
}