Files
cpu-check/README.md
Kevin Boyd 83eed0a886 Sync with upstream repo.
Changes include:
* CPU check has been broken up into a number of small libraries
* BoringSSL option has been removed
* Better abseil integration
2020-11-09 13:03:39 -08:00

73 lines
2.3 KiB
Markdown

# 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.