Performance openmp中的printf性能问题

Performance openmp中的printf性能问题,performance,printf,openmp,simulation,Performance,Printf,Openmp,Simulation,我被告知不要在openmp程序中使用printf,因为它会降低并行模拟程序的性能 我想知道用什么来代替它。我的意思是如何在不使用printf的情况下显示程序的输出 我有以下使用openmp的AES-128模拟问题,需要进一步说明 我想知道如何在不降低模拟性能的情况下输出密码文本 提前谢谢。你不能既吃馅饼又吃馅饼。决定您是否希望获得出色的并行性能,或者在运行并行循环时查看算法的输出是否很重要 显而易见的离线解决方案是将明文、密钥和密文存储在数组中。在您的案例中,在原始案例中需要119 MiB(=

我被告知不要在openmp程序中使用printf,因为它会降低并行模拟程序的性能

我想知道用什么来代替它。我的意思是如何在不使用printf的情况下显示程序的输出

我有以下使用openmp的AES-128模拟问题,需要进一步说明

我想知道如何在不降低模拟性能的情况下输出密码文本


提前谢谢。

你不能既吃馅饼又吃馅饼。决定您是否希望获得出色的并行性能,或者在运行并行循环时查看算法的输出是否很重要

显而易见的离线解决方案是将明文、密钥和密文存储在数组中。在您的案例中,在原始案例中需要119 MiB(
=650000*(3*4*16)
字节),在65000次试验的案例中只需要12 MiB。没有什么是一个现代机器无法处理的。后一种情况甚至适用于某些服务器类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);
#定义试验65000
int(*键)[16];
int(*pt)[16];
int(*ct)[16];
双定时器;
key=malloc(试验*sizeof(*key));
pt=malloc(试验*尺寸(*pt));
ct=malloc(试验*sizeof(*ct));
计时器=-omp_get_wtime();
#pragma omp并行专用(rnd,j)
对于(i=0;i>8)和0xff);
pt[4*j+1]=键[i][4*j+1];
键[i][4*j+2]=((rnd[j]>>16)和0xff);
pt[i][4*j+2]=键[i][4*j+2];
键[i][4*j+3]=((rnd[j]>>24)和0xff);
pt[i][4*j+3]=键[i][4*j+3];
}
加密(密钥[i],pt[i],ct[i]);
}
计时器+=omp_get_wtime();
printf(“加密耗时%.6f秒\n”,计时器);
//现在按顺序显示结果
对于(i=0;ict[i]
}
免费(钥匙);免费(pt);免费(ct);

要查看速度,只需测量在平行区域花费的时间。如果您也测量显示结果所需的时间,您将回到您开始的位置。

Hristo,我没有话要感谢您。我没有足够的分数给你任何分数,但我衷心感谢你。非常感谢您和整个stackoverflow社区,感谢他们的卓越贡献