# CPU Check CPU torture test designed for SMP systems, attempting to find CPU hardware faults, focusing primarily on the x86_64 architecture. The basic operation is to: * Run threads with affinity fixed to each logical CPU. * Generate a chunk of random data, either dictionary based text, or random binary data. * Run a number of checksum/hash algorithms over the data, store their results. * Compress the data via one of (zlib, ...). * Encrypt the data via AES-256-GCM. * Copy the data ('rep movsb' on x86, else memcpy). * Switch affinity to an alternate logical CPU. * Decrypt. * Decompress. * Run checksum/hash algorithms and compare with stored results. Algorithms are chosen to exercise various hardware extensions. Eg. on x86_64, SSE4.2, AVX, etc. ## Prerequisites: Designed to run under Unix/Linux OS. * cmake: https://cmake.org/ * zlib * OpenSSL * Abseil-cpp: https://github.com/abseil/abseil-cpp Note that Abseil must be built with the C++17 standard and include the StatusOr package (release 2020_09_23 or later). ## Building ``` sh$ git clone --recursive https://github.com/google/cpu-check.git sh$ cd cpu-check sh$ mkdir build sh$ cd build sh$ cmake .. sh$ make ``` ## Options Some options have been implememented that affect the build, which may be passed to cmake via, eg: ```cmake -DCMAKE_BUILD_TYPE=(Debug|Release)``` * CMAKE_BUILD_TYPE=(Release|Debug) * USE_CLANG=(ON|OFF) * BUILD_STATIC=(ON|OFF) ## TODO: * Use git submodules for: * highwayhash: https://github.com/google/highwayhash * crc32c: https://github.com/google/crc32c * cityhash: https://github.com/google/cityhash * brotli: https://github.com/google/brotli * gipfeli: https://github.com/google/gipfeli * Expand encryption coverage - find those algorithms that stress the HW. * Flags to enable/disable steps, eg. encryption. * Flags controlling min/max buffer size. * Use cpuid to dynamically select appropriate instruction set extensions. * Query ACPI/cpuid for more meaningful CPU identification. * Extra x86_64 instruction coverage: * movnti (SSE2 mov doubleword with non-temporal hint) * prefetch* * movbe (mov with byte swap) * Consider floating point tests? * Keep stats on corruptions (eg. buffer lengths/alignments, detection means (crc32), etc). * Try to narrow down corruptions automatically.