正在加载图片...
第4期 杨先伟,等:随机序列的扑克检测优化研究 .517, dtsc()函数,该指令或函数返回CPU时钟周期值, //扑克测试优化后代码 按现代CPU的时钟频率计算,此计数器可精确到纳 int poker_test(BYTE p_u8,int n 秒级。两次RDTSC指令返回的时钟周期之差再除 以CPU频率,即可得到以s为单位的耗时值。 double v; 原算法和优化算法(算法1)对1000个样本进 BYTE p_bound p_u8 n/8,d; 行检测的性能统计结果见表3。 u32c4[16]={0},c8[256]={0}; 表3算法性能对比 while(p_u8 p_bound Table 3 The performance comparison of two algorithms 性能对比 原算法 算法1 d=*P_u8++; 耗时/s 2.244 0.236 c8[d]+: 速度比 1:1 9.508:1 c4[d4]++; 理论评估时只估算了最重要也最耗时的步骤 c4[d&0xf]++: 1),略去了后面的步骤的耗时。虽然步骤2)的计算 过程和原算法一样,但优化算法对步骤3)也做了相 /m=8时计算统计量 应的优化。实验的结果表明,优化算法通过充分利 v=poker_get_statistics(8,n,c8); 用CPU字长一次处理多个比特,优化整合算法流程 if(v>=POKER_BOUND_M_8) 减少不必要的计算,精简统计量的计算和判断过程 的技术方式和方法,的确可以显著地提升扑克检测 return -8; 的检测性能,且检测速度可提升9.5倍左右。 / 此外,算法性能提升显著的另外一个重要原因 /m=4时计算统计量 是扑克检测中的参数m取值较为特殊,m=8恰好 v=poker_get_statistics(4,n,c4); 是一个字节,m=4恰好是将一个字节拆分为两个 if(v >POKER_BOUND_M_4) “半字节”。这使得优化算法基于字节的处理方式 得到了淋漓尽致的发挥。 return -4; 6 结论 return 1; 本文对我国随机性检测规范采用的扑克检测算 } 法进行优化实现。通过充分利用CPU字长一次处 //扑克检测计算统计量,n为序列比特长度 理多个比特,优化整合算法流程减少不必要的计算, /m为参数,P_ct为子序列频数 精简统计量的计算和判断过程的技术方式和方法, double poker_get_statistics(int m,int n,u32 可以显著地提升扑克检测的检测性能,实验结果表 p_ctr) 明检测速度可提升9.5倍左右。因此,建议在实际 检测中采用软件实现时使用本文提出的扑克检测快 int i,blk_sz,pow_m; 速实现方式以提高扑克检测的检测效率。NIST和 double blk_sz_inv,sum; 我国的随机性检测规范还有很多别的检测项,其中 sum=0.0: 还有很多检测项可以做必要的性能优化,这将是今 pow_m 1 <<m; 后工作的一个研究方向。另外,怎样利用并行化技 blk sz n m; 术(如多线程技术,SMD指令、GPU运算)快速实现 blk_sz_inv 1.0 blk_sz; 这些检测项,也是今后研究的另一个方向。 for(i 0;i<pow_m;i++) 附录优化算法的代码 sum +p_ctr[i]p_ctr[i]blk_sz_inv; 本节列出优化算法(算法1)的标准C代码。其 中poker_.test函数为扑克测试优化后的功能实现函 return sum pow_m )-blk_sz; 数,poker_.get_statistics函数为扑克检测中计算统计 量的函数。rdtsc()函数,该指令或函数返回 CPU 时钟周期值, 按现代 CPU 的时钟频率计算,此计数器可精确到纳 秒级。 两次 RDTSC 指令返回的时钟周期之差再除 以 CPU 频率,即可得到以 s 为单位的耗时值。 原算法和优化算法(算法 1)对 1 000 个样本进 行检测的性能统计结果见表 3。 表 3 算法性能对比 Table 3 The performance comparison of two algorithms 性能对比 原算法 算法 1 耗时/ s 2.244 0.236 速度比 1:1 9.508:1 理论评估时只估算了最重要也最耗时的步骤 1),略去了后面的步骤的耗时。 虽然步骤 2)的计算 过程和原算法一样,但优化算法对步骤 3)也做了相 应的优化。 实验的结果表明,优化算法通过充分利 用 CPU 字长一次处理多个比特,优化整合算法流程 减少不必要的计算,精简统计量的计算和判断过程 的技术方式和方法,的确可以显著地提升扑克检测 的检测性能,且检测速度可提升 9.5 倍左右。 此外,算法性能提升显著的另外一个重要原因 是扑克检测中的参数 m 取值较为特殊,m = 8 恰好 是一个字节,m = 4 恰好是将一个字节拆分为两个 “半字节”。 这使得优化算法基于字节的处理方式 得到了淋漓尽致的发挥。 6 结论 本文对我国随机性检测规范采用的扑克检测算 法进行优化实现。 通过充分利用 CPU 字长一次处 理多个比特,优化整合算法流程减少不必要的计算, 精简统计量的计算和判断过程的技术方式和方法, 可以显著地提升扑克检测的检测性能,实验结果表 明检测速度可提升 9.5 倍左右。 因此,建议在实际 检测中采用软件实现时使用本文提出的扑克检测快 速实现方式以提高扑克检测的检测效率。 NIST 和 我国的随机性检测规范还有很多别的检测项,其中 还有很多检测项可以做必要的性能优化,这将是今 后工作的一个研究方向。 另外,怎样利用并行化技 术(如多线程技术、SIMD 指令、GPU 运算)快速实现 这些检测项,也是今后研究的另一个方向。 附录 优化算法的代码 本节列出优化算法(算法 1)的标准 C 代码。 其 中 poker_test 函数为扑克测试优化后的功能实现函 数,poker_get_statistics 函数为扑克检测中计算统计 量的函数。 / / 扑克测试优化后代码 int poker_test(BYTE ∗p_u8, int n ) { double v; BYTE ∗p_bound = p_u8 + n / 8, d; u32 c4[16] = {0}, c8[256] = {0}; while( p_u8 < p_bound ) { d = ∗p_u8++; c8[ d ]++; c4[ d ≫ 4 ]++; c4[ d & 0xf ]++; } / / m = 8 时计算统计量 v = poker_get_statistics(8, n, c8); if(v > = POKER_BOUND_M_8) { return -8; } / / m = 4 时计算统计量 v = poker_get_statistics(4, n, c4); if(v > = POKER_BOUND_M_4) { return -4; } return 1; } / / 扑克检测计算统计量,n 为序列比特长度 / / m 为参数,p_ctr 为子序列频数 double poker_get_statistics(int m, int n, u32 ∗ p_ctr) { int i, blk_sz, pow_m; double blk_sz_inv, sum; sum = 0.0; pow_m = 1 << m; blk_sz = n / m; blk_sz_inv = 1.0 / blk_sz; for( i = 0; i < pow_m; i++ ) { sum + = p_ctr[i] ∗ p_ctr[i] ∗ blk_sz_inv; } return ( sum ∗ pow_m ) - blk_sz; } 第 4 期 杨先伟,等:随机序列的扑克检测优化研究 ·517·
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有