@@ -606,4 +606,88 @@ namespace osuCrypto
606
606
std::cout << " ENABLE_Silent_VOLE = false" << std::endl;
607
607
#endif
608
608
}
609
+
610
+
611
+ void AESBenchmark (const oc::CLP& cmd)
612
+ {
613
+ u64 n = roundUpTo (cmd.getOr (" n" , 1ull << cmd.getOr (" nn" , 20 )), 8 );
614
+ u64 t =cmd.getOr (" t" , 10 );
615
+ using AES_ = AES;// details::AES<details::AESTypes::Portable>;
616
+
617
+ auto unroll8 = [](AES_& aes, block* __restrict s)
618
+ {
619
+ block b[8 ];
620
+ b[0 ] = AES_::firstFn (s[0 ], aes.mRoundKey [0 ]);
621
+ b[1 ] = AES_::firstFn (s[1 ], aes.mRoundKey [0 ]);
622
+ b[2 ] = AES_::firstFn (s[2 ], aes.mRoundKey [0 ]);
623
+ b[3 ] = AES_::firstFn (s[3 ], aes.mRoundKey [0 ]);
624
+ b[4 ] = AES_::firstFn (s[4 ], aes.mRoundKey [0 ]);
625
+ b[5 ] = AES_::firstFn (s[5 ], aes.mRoundKey [0 ]);
626
+ b[6 ] = AES_::firstFn (s[6 ], aes.mRoundKey [0 ]);
627
+ b[7 ] = AES_::firstFn (s[7 ], aes.mRoundKey [0 ]);
628
+
629
+ for (u64 i = 1 ; i < 9 ; ++i)
630
+ {
631
+ b[0 ] = AES_::roundFn (b[0 ], aes.mRoundKey [i]);
632
+ b[1 ] = AES_::roundFn (b[1 ], aes.mRoundKey [i]);
633
+ b[2 ] = AES_::roundFn (b[2 ], aes.mRoundKey [i]);
634
+ b[3 ] = AES_::roundFn (b[3 ], aes.mRoundKey [i]);
635
+ b[4 ] = AES_::roundFn (b[4 ], aes.mRoundKey [i]);
636
+ b[5 ] = AES_::roundFn (b[5 ], aes.mRoundKey [i]);
637
+ b[6 ] = AES_::roundFn (b[6 ], aes.mRoundKey [i]);
638
+ b[7 ] = AES_::roundFn (b[7 ], aes.mRoundKey [i]);
639
+ }
640
+
641
+
642
+ b[0 ] = AES_::penultimateFn (b[0 ], aes.mRoundKey [9 ]);
643
+ b[1 ] = AES_::penultimateFn (b[1 ], aes.mRoundKey [9 ]);
644
+ b[2 ] = AES_::penultimateFn (b[2 ], aes.mRoundKey [9 ]);
645
+ b[3 ] = AES_::penultimateFn (b[3 ], aes.mRoundKey [9 ]);
646
+ b[4 ] = AES_::penultimateFn (b[4 ], aes.mRoundKey [9 ]);
647
+ b[5 ] = AES_::penultimateFn (b[5 ], aes.mRoundKey [9 ]);
648
+ b[6 ] = AES_::penultimateFn (b[6 ], aes.mRoundKey [9 ]);
649
+ b[7 ] = AES_::penultimateFn (b[7 ], aes.mRoundKey [9 ]);
650
+ s[0 ] = AES_::finalFn (b[0 ], aes.mRoundKey [10 ]);
651
+ s[1 ] = AES_::finalFn (b[1 ], aes.mRoundKey [10 ]);
652
+ s[2 ] = AES_::finalFn (b[2 ], aes.mRoundKey [10 ]);
653
+ s[3 ] = AES_::finalFn (b[3 ], aes.mRoundKey [10 ]);
654
+ s[4 ] = AES_::finalFn (b[4 ], aes.mRoundKey [10 ]);
655
+ s[5 ] = AES_::finalFn (b[5 ], aes.mRoundKey [10 ]);
656
+ s[6 ] = AES_::finalFn (b[6 ], aes.mRoundKey [10 ]);
657
+ s[7 ] = AES_::finalFn (b[7 ], aes.mRoundKey [10 ]);
658
+
659
+ };
660
+
661
+ oc::AlignedUnVector<block> x (n);
662
+ auto n8 = n / 8 ;
663
+ AES_ aes (block (42352345 , 3245345234676534 ));
664
+ Timer timer;
665
+ timer.setTimePoint (" begin" );
666
+ for (u64 tt = 0 ; tt < t; ++tt)
667
+ {
668
+ for (u64 i = 0 ; i < n; i += 8 )
669
+ {
670
+ unroll8 (aes, x.data () + i);
671
+ }
672
+ timer.setTimePoint (" unroll" );
673
+ }
674
+
675
+ for (u64 tt = 0 ; tt < t; ++tt)
676
+ {
677
+ for (u64 i = 0 ; i < n; i += 8 )
678
+ {
679
+ aes.ecbEncBlocks <8 >(x.data () + i, x.data () + i);
680
+ }
681
+ timer.setTimePoint (" aes <>" );
682
+ }
683
+
684
+ for (u64 tt = 0 ; tt < t; ++tt)
685
+ {
686
+ aes.ecbEncBlocks (x, x);
687
+ timer.setTimePoint (" aes " );
688
+ }
689
+
690
+ std::cout << timer << std::endl;
691
+
692
+ }
609
693
}
0 commit comments