#include #include #include "../src/cpu/utils.hpp" #include "../src/cpu/x86/sse.hpp" #include "../src/cpu/naive.hpp" #include "../src/platform/timer.hpp" using namespace cpu; using namespace platform; using namespace std; #define MAX_ITER 1000 * 1000 * 100 void naive128(UInt *v1_128, UInt *v2_128) { Timer t=Timer("Naive 128: "); for (int i = 0; i < MAX_ITER; i++) { Naive::add_128(v1_128, v2_128); } } void int128(SSE *sse, UInt *v1_128, UInt *v2_128) { Timer t=Timer("SIMD(Byte) 256: "); for (int i = 0; i < MAX_ITER; i++) { sse->add_128(v1_128, v2_128); } } void long128(SSE *sse, ULong *v1_128_l, ULong *v2_128_l) { Timer t=Timer("SIMD(Byte) 256: "); for (int i = 0; i < MAX_ITER; i++) { sse->add_128(v1_128_l, v2_128_l); } } void byte128(SSE *sse, UChar *c1_128, UChar *c2_128) { Timer t=Timer("SIMD(Byte) 256: "); for (int i = 0; i < MAX_ITER; i++) { sse->add_128(c1_128, c2_128); } } void naive256(UInt *v1_256, UInt *v2_256) { Timer t=Timer("Naive 256: "); for (int i = 0; i < MAX_ITER; i++) { Naive::add_256(v1_256, v2_256); } } void int256(SSE *sse, UInt *v1_256, UInt *v2_256) { Timer t=Timer("SIMD(Byte) 256: "); for (int i = 0; i < MAX_ITER; i++) { sse->add_256(v1_256, v2_256); } } void long256(SSE *sse, ULong *v1_256, ULong *v2_256) { Timer t=Timer("SIMD(Byte) 256: "); for (int i = 0; i < MAX_ITER; i++) { sse->add_256(v1_256, v2_256); } } void byte256(SSE *sse, UChar *v1_256, UChar *v2_256) { Timer t=Timer("SIMD(Byte) 256: "); for (int i = 0; i < MAX_ITER; i++) { sse->add_256(v1_256, v2_256); } } int main(int argc, char **argcv) { SSE sse = SSE(); UChar c1_128[CHAR_LEN_128] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10}; UChar c2_128[CHAR_LEN_128] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10}; UInt v1_128[INT_LEN_128] = {0x1, 0x2, 0x3, 0x4}; UInt v2_128[INT_LEN_128] = {0x1, 0x2, 0x3, 0x4}; ULong v1_128_l[LONG_LEN_128]; ULong v2_128_l[LONG_LEN_128]; UChar c1_256[CHAR_LEN_256] = { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10}; UChar c2_256[CHAR_LEN_256] = { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10}; UInt v1_256[INT_LEN_256] = {0x1, 0x2, 0x3, 0x4, 0x1, 0x2, 0x3, 0x4}; UInt v2_256[INT_LEN_256] = {0x1, 0x2, 0x3, 0x4, 0x1, 0x2, 0x3, 0x4}; ULong v1_256_l[LONG_LEN_256]; ULong v2_256_l[LONG_LEN_256]; Utils::int128ToLong(v1_128, v1_128_l); Utils::int128ToLong(v2_128, v2_128_l); Utils::int256ToLong(v1_256, v1_256_l); Utils::int256ToLong(v2_256, v2_256_l); sse.add_128(v1_128, v2_128); long int start, end; Utils::printHex(v1_128, INT_LEN_128); Utils::printHex(v2_128, INT_LEN_128); Utils::printHex(v1_128_l, LONG_LEN_128); Utils::printHex(v2_128_l, LONG_LEN_128); naive128(v1_128, v2_128); int128(&sse, v1_128, v2_128); long128(&sse, v1_128_l, v2_128_l); byte128(&sse, c1_128, c2_128); naive256(v1_256, v2_256); byte256(&sse, c1_256, c2_256); int256(&sse, v1_256, v2_256); long256(&sse, v1_256_l, v2_256_l); }