在OpenMP中printf的性能问题(printf performance issue in op

2019-11-02 15:39发布

我已经被告知不要用printf在OpenMP程序,因为它降低了并行仿真程序的性能。

我想知道什么是对的替代品。 我的意思是如何在不使用printf的显示程序的输出。

我有使用OpenMP这就需要进一步的评论如下AES-128仿真问题AES的并行模拟用C使用OpenMP

我想知道如何输出而不降低仿真性能的密文?

提前致谢。

Answer 1:

你不能同时拥有您的馅饼吃。 如果你想有很大的并行性能,或者如果它看到算法的输出,同时运行并行循环是非常重要的决定。

最明显的离线解决方案是在存储阵列中的明文,密钥和密文。 在你的情况,将要求119的MIB( = 650000*(3*4*16)字节)在原来的情况下,只有12 MIB与65000周的试验的情况。 没有一个现代机器的RAM GIBS无法处理。 后一种情况甚至甚至适合在一些服务器级CPU的最后一级缓存。

#define TRIALS 65000

int (*key)[16];
int (*pt)[16];
int (*ct)[16];

double timer;

key = malloc(TRIALS * sizeof(*key));
pt = malloc(TRIALS * sizeof(*pt));
ct = malloc(TRIALS * sizeof(*ct));

timer = -omp_get_wtime();

#pragma omp parallel for private(rnd,j)
for(i = 0; i < TRIALS; i++)
{
   ...

   for(j = 0; j < 4; j++)
   {
      key[i][4*j]   = (rnd[j] & 0xff);
      pt[i][4*j]    = key[i][4*j];
      key[i][4*j+1] = ((rnd[j] >> 8)  & 0xff) ; 
      pt[4*j+1]     = key[i][4*j+1];
      key[i][4*j+2] = ((rnd[j] >> 16) & 0xff) ;
      pt[i][4*j+2]  = key[i][4*j+2];
      key[i][4*j+3] = ((rnd[j] >> 24) & 0xff) ;
      pt[i][4*j+3]  = key[i][4*j+3];
   }

   encrypt(key[i],pt[i],ct[i]);
}

timer += omp_get_wtime();
printf("Encryption took %.6f seconds\n", timer);

// Now display the results serially
for (i = 0; i < TRIALS; i++)
{
    display pt[i], key[i] -> ct[i]
}

free(key); free(pt); free(ct);

要查看加速,你必须衡量只能在并行区域所花费的时间。 如果你还测量才能显示结果的时候,你会回到你开始的地方。



文章来源: printf performance issue in openmp