diff --git a/main.cpp b/main.cpp index 4396c47..a9b9a6e 100644 --- a/main.cpp +++ b/main.cpp @@ -1,4 +1,4 @@ -#define _CRT_SECURE_NO_DEPRECATE +#include "platform.h" #include #include #include @@ -8,8 +8,6 @@ #include "rans_byte.h" -#include - // This is just the sample program. All the meat is in rans_byte.h. static void panic(const char *fmt, ...) @@ -46,17 +44,6 @@ static uint8_t* read_file(char const* filename, size_t* out_size) return buf; } -#define WIN32_LEAN_AND_MEAN -#include - -double timer() -{ - LARGE_INTEGER ctr, freq; - QueryPerformanceCounter(&ctr); - QueryPerformanceFrequency(&freq); - return 1.0 * ctr.QuadPart / freq.QuadPart; -} - // ---- Stats struct SymbolStats @@ -196,7 +183,7 @@ int main() uint64_t enc_clocks = __rdtsc() - enc_start_time; double enc_time = timer() - start_time; - printf("%lld clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", enc_clocks, 1.0 * enc_clocks / in_size, 1.0 * in_size / (enc_time * 1048576.0)); + printf("%"PRIu64" clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", enc_clocks, 1.0 * enc_clocks / in_size, 1.0 * in_size / (enc_time * 1048576.0)); } printf("rANS: %d bytes\n", (int) (out_buf + out_max_size - rans_begin)); @@ -217,7 +204,7 @@ int main() uint64_t dec_clocks = __rdtsc() - dec_start_time; double dec_time = timer() - start_time; - printf("%lld clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", dec_clocks, 1.0 * dec_clocks / in_size, 1.0 * in_size / (dec_time * 1048576.0)); + printf("%"PRIu64" clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", dec_clocks, 1.0 * dec_clocks / in_size, 1.0 * in_size / (dec_time * 1048576.0)); } // check decode results @@ -260,7 +247,7 @@ int main() uint64_t enc_clocks = __rdtsc() - enc_start_time; double enc_time = timer() - start_time; - printf("%lld clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", enc_clocks, 1.0 * enc_clocks / in_size, 1.0 * in_size / (enc_time * 1048576.0)); + printf("%"PRIu64" clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", enc_clocks, 1.0 * enc_clocks / in_size, 1.0 * in_size / (enc_time * 1048576.0)); } printf("interleaved rANS: %d bytes\n", (int) (out_buf + out_max_size - rans_begin)); @@ -294,7 +281,7 @@ int main() uint64_t dec_clocks = __rdtsc() - dec_start_time; double dec_time = timer() - start_time; - printf("%lld clocks, %.1f clocks/symbol (%5.1fMB/s)\n", dec_clocks, 1.0 * dec_clocks / in_size, 1.0 * in_size / (dec_time * 1048576.0)); + printf("%"PRIu64" clocks, %.1f clocks/symbol (%5.1fMB/s)\n", dec_clocks, 1.0 * dec_clocks / in_size, 1.0 * in_size / (dec_time * 1048576.0)); } // check decode results diff --git a/main64.cpp b/main64.cpp index 5b0d3fb..f771fcf 100644 --- a/main64.cpp +++ b/main64.cpp @@ -1,4 +1,4 @@ -#define _CRT_SECURE_NO_DEPRECATE +#include "platform.h" #include #include #include @@ -8,8 +8,6 @@ #include "rans64.h" -#include - // This is just the sample program. All the meat is in rans_byte.h. static void panic(const char *fmt, ...) @@ -46,17 +44,6 @@ static uint8_t* read_file(char const* filename, size_t* out_size) return buf; } -#define WIN32_LEAN_AND_MEAN -#include - -double timer() -{ - LARGE_INTEGER ctr, freq; - QueryPerformanceCounter(&ctr); - QueryPerformanceFrequency(&freq); - return 1.0 * ctr.QuadPart / freq.QuadPart; -} - // ---- Stats struct SymbolStats @@ -198,7 +185,7 @@ int main() uint64_t enc_clocks = __rdtsc() - enc_start_time; double enc_time = timer() - start_time; - printf("%lld clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", enc_clocks, 1.0 * enc_clocks / in_size, 1.0 * in_size / (enc_time * 1048576.0)); + printf("%"PRIu64" clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", enc_clocks, 1.0 * enc_clocks / in_size, 1.0 * in_size / (enc_time * 1048576.0)); } printf("rANS: %d bytes\n", (int) ((out_end - rans_begin) * sizeof(uint32_t))); @@ -219,7 +206,7 @@ int main() uint64_t dec_clocks = __rdtsc() - dec_start_time; double dec_time = timer() - start_time; - printf("%lld clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", dec_clocks, 1.0 * dec_clocks / in_size, 1.0 * in_size / (dec_time * 1048576.0)); + printf("%"PRIu64" clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", dec_clocks, 1.0 * dec_clocks / in_size, 1.0 * in_size / (dec_time * 1048576.0)); } // check decode results @@ -262,7 +249,7 @@ int main() uint64_t enc_clocks = __rdtsc() - enc_start_time; double enc_time = timer() - start_time; - printf("%lld clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", enc_clocks, 1.0 * enc_clocks / in_size, 1.0 * in_size / (enc_time * 1048576.0)); + printf("%"PRIu64" clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", enc_clocks, 1.0 * enc_clocks / in_size, 1.0 * in_size / (enc_time * 1048576.0)); } printf("interleaved rANS: %d bytes\n", (int) ((out_end - rans_begin) * sizeof(uint32_t))); @@ -296,7 +283,7 @@ int main() uint64_t dec_clocks = __rdtsc() - dec_start_time; double dec_time = timer() - start_time; - printf("%lld clocks, %.1f clocks/symbol (%5.1fMB/s)\n", dec_clocks, 1.0 * dec_clocks / in_size, 1.0 * in_size / (dec_time * 1048576.0)); + printf("%"PRIu64" clocks, %.1f clocks/symbol (%5.1fMB/s)\n", dec_clocks, 1.0 * dec_clocks / in_size, 1.0 * in_size / (dec_time * 1048576.0)); } // check decode results diff --git a/main_alias.cpp b/main_alias.cpp index 49387d0..8c648f4 100644 --- a/main_alias.cpp +++ b/main_alias.cpp @@ -1,4 +1,4 @@ -#define _CRT_SECURE_NO_DEPRECATE +#include "platform.h" #include #include #include @@ -8,8 +8,6 @@ #include "rans_byte.h" -#include - static void panic(const char *fmt, ...) { va_list arg; @@ -44,17 +42,6 @@ static uint8_t* read_file(char const* filename, size_t* out_size) return buf; } -#define WIN32_LEAN_AND_MEAN -#include - -double timer() -{ - LARGE_INTEGER ctr, freq; - QueryPerformanceCounter(&ctr); - QueryPerformanceFrequency(&freq); - return 1.0 * ctr.QuadPart / freq.QuadPart; -} - // ---- Stats struct SymbolStats @@ -323,7 +310,7 @@ int main() uint64_t enc_clocks = __rdtsc() - enc_start_time; double enc_time = timer() - start_time; - printf("%lld clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", enc_clocks, 1.0 * enc_clocks / in_size, 1.0 * in_size / (enc_time * 1048576.0)); + printf("%"PRIu64" clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", enc_clocks, 1.0 * enc_clocks / in_size, 1.0 * in_size / (enc_time * 1048576.0)); } printf("rANS: %d bytes\n", (int) (out_buf + out_max_size - rans_begin)); @@ -344,7 +331,7 @@ int main() uint64_t dec_clocks = __rdtsc() - dec_start_time; double dec_time = timer() - start_time; - printf("%lld clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", dec_clocks, 1.0 * dec_clocks / in_size, 1.0 * in_size / (dec_time * 1048576.0)); + printf("%"PRIu64" clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", dec_clocks, 1.0 * dec_clocks / in_size, 1.0 * in_size / (dec_time * 1048576.0)); } // check decode results @@ -387,7 +374,7 @@ int main() uint64_t enc_clocks = __rdtsc() - enc_start_time; double enc_time = timer() - start_time; - printf("%lld clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", enc_clocks, 1.0 * enc_clocks / in_size, 1.0 * in_size / (enc_time * 1048576.0)); + printf("%"PRIu64" clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", enc_clocks, 1.0 * enc_clocks / in_size, 1.0 * in_size / (enc_time * 1048576.0)); } printf("interleaved rANS: %d bytes\n", (int) (out_buf + out_max_size - rans_begin)); @@ -419,7 +406,7 @@ int main() uint64_t dec_clocks = __rdtsc() - dec_start_time; double dec_time = timer() - start_time; - printf("%lld clocks, %.1f clocks/symbol (%5.1fMB/s)\n", dec_clocks, 1.0 * dec_clocks / in_size, 1.0 * in_size / (dec_time * 1048576.0)); + printf("%"PRIu64" clocks, %.1f clocks/symbol (%5.1fMB/s)\n", dec_clocks, 1.0 * dec_clocks / in_size, 1.0 * in_size / (dec_time * 1048576.0)); } // check decode results diff --git a/main_simd.cpp b/main_simd.cpp index 75fda79..11e18f0 100644 --- a/main_simd.cpp +++ b/main_simd.cpp @@ -1,4 +1,4 @@ -#define _CRT_SECURE_NO_DEPRECATE +#include "platform.h" #include #include #include @@ -8,8 +8,6 @@ #include "rans_word_sse41.h" -#include - // This is just the sample program. All the meat is in rans_byte.h. static void panic(const char *fmt, ...) @@ -46,17 +44,6 @@ static uint8_t* read_file(char const* filename, size_t* out_size) return buf; } -#define WIN32_LEAN_AND_MEAN -#include - -double timer() -{ - LARGE_INTEGER ctr, freq; - QueryPerformanceCounter(&ctr); - QueryPerformanceFrequency(&freq); - return 1.0 * ctr.QuadPart / freq.QuadPart; -} - // ---- Stats struct SymbolStats @@ -183,7 +170,7 @@ int main() uint64_t enc_clocks = __rdtsc() - enc_start_time; double enc_time = timer() - start_time; - printf("%lld clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", enc_clocks, 1.0 * enc_clocks / in_size, 1.0 * in_size / (enc_time * 1048576.0)); + printf("%"PRIu64" clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", enc_clocks, 1.0 * enc_clocks / in_size, 1.0 * in_size / (enc_time * 1048576.0)); } printf("rANS: %d bytes\n", (int) (out_buf + out_max_size - (uint8_t *)rans_begin)); @@ -204,7 +191,7 @@ int main() uint64_t dec_clocks = __rdtsc() - dec_start_time; double dec_time = timer() - start_time; - printf("%lld clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", dec_clocks, 1.0 * dec_clocks / in_size, 1.0 * in_size / (dec_time * 1048576.0)); + printf("%"PRIu64" clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", dec_clocks, 1.0 * dec_clocks / in_size, 1.0 * in_size / (dec_time * 1048576.0)); } // check decode results @@ -246,7 +233,7 @@ int main() uint64_t enc_clocks = __rdtsc() - enc_start_time; double enc_time = timer() - start_time; - printf("%lld clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", enc_clocks, 1.0 * enc_clocks / in_size, 1.0 * in_size / (enc_time * 1048576.0)); + printf("%"PRIu64" clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", enc_clocks, 1.0 * enc_clocks / in_size, 1.0 * in_size / (enc_time * 1048576.0)); } printf("interleaved rANS: %d bytes\n", (int) (out_buf + out_max_size - (uint8_t*)rans_begin)); @@ -277,7 +264,7 @@ int main() uint64_t dec_clocks = __rdtsc() - dec_start_time; double dec_time = timer() - start_time; - printf("%lld clocks, %.1f clocks/symbol (%5.1fMB/s)\n", dec_clocks, 1.0 * dec_clocks / in_size, 1.0 * in_size / (dec_time * 1048576.0)); + printf("%"PRIu64" clocks, %.1f clocks/symbol (%5.1fMB/s)\n", dec_clocks, 1.0 * dec_clocks / in_size, 1.0 * in_size / (dec_time * 1048576.0)); } // check decode results @@ -314,7 +301,7 @@ int main() uint64_t enc_clocks = __rdtsc() - enc_start_time; double enc_time = timer() - start_time; - printf("%lld clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", enc_clocks, 1.0 * enc_clocks / in_size, 1.0 * in_size / (enc_time * 1048576.0)); + printf("%"PRIu64" clocks, %.1f clocks/symbol (%5.1fMiB/s)\n", enc_clocks, 1.0 * enc_clocks / in_size, 1.0 * in_size / (enc_time * 1048576.0)); } printf("SIMD rANS: %d bytes\n", (int) (out_buf + out_max_size - (uint8_t*)rans_begin)); @@ -346,7 +333,7 @@ int main() uint64_t dec_clocks = __rdtsc() - dec_start_time; double dec_time = timer() - start_time; - printf("%lld clocks, %.1f clocks/symbol (%5.1fMB/s)\n", dec_clocks, 1.0 * dec_clocks / in_size, 1.0 * in_size / (dec_time * 1048576.0)); + printf("%"PRIu64" clocks, %.1f clocks/symbol (%5.1fMB/s)\n", dec_clocks, 1.0 * dec_clocks / in_size, 1.0 * in_size / (dec_time * 1048576.0)); } // check decode results diff --git a/platform.h b/platform.h new file mode 100644 index 0000000..cc3c32c --- /dev/null +++ b/platform.h @@ -0,0 +1,61 @@ +// Just some platform utilities. +#ifndef PLATFORM_H_INCLUDED +#define PLATFORM_H_INCLUDED + +// x86 intrinsics (__rdtsc etc.) + +#if defined(_MSC_VER) + +#define _CRT_SECURE_NO_DEPRECATE +#include + +#elif defined(__GNUC__) + +#include + +#else +#error Unknown compiler! +#endif + +// Timer + +#if defined(_WIN32) + +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX +#include + +#define PRIu64 "llu" + +double timer() +{ + LARGE_INTEGER ctr, freq; + QueryPerformanceCounter(&ctr); + QueryPerformanceFrequency(&freq); + return 1.0 * ctr.QuadPart / freq.QuadPart; +} + +#elif defined(__linux__) + +#define __STDC_FORMAT_MACROS +#include +#include + +static inline double timer() +{ + timespec ts; + ts.tv_sec = 0; + ts.tv_nsec = 0; + int status = clock_gettime(CLOCK_MONOTONIC, &ts); + assert(status == 0); + return double(ts.tv_sec) + 1.0e-9 * double(ts.tv_nsec); +} + +#else + +#error Unknown platform! + +#endif + +#endif // PLATFORM_H_INCLUDED +