cuda_memtest
This software tests GPU memory for hardware errors and soft errors using CUDA (or OpenCL).
Note for this Fork
This is a fork of the original, yet long-time unmaintained project at https://sourceforge.net/projects/cudagpumemtest/ .
After our fork in 2013 (v1.2.3), we primarily focused on support for newer CUDA versions and support of newer Nvidia hardware. Pull-requests maintaining the OpenCL versions are nevertheless still welcome.
License
Illinois Open Source License
University of Illinois/NCSA
Open Source License
Copyright 2009-2012, University of Illinois. All rights reserved.
Copyright 2013-2019, The developers of PIConGPU at Helmholtz-Zentrum Dresden-Rossendorf
Developed by:
Innovative Systems Lab
National Center for Supercomputing Applications
http://www.ncsa.uiuc.edu/AboutUs/Directorates/ISL.html
Forked and maintained for newer Nvidia GPUs since 2013 by:
Axel Huebl and Rene Widera
Computational Radiation Physics Group
Helmholtz-Zentrum Dresden-Rossendorf
https://www.hzdr.de/crp
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal with the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimers.
-
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimers in the documentation and/or other materials provided with the distribution.
-
Neither the names of the Innovative Systems Lab, the National Center for Supercomputing Applications, nor the names of its contributors may be used to endorse or promote products derived from this Software without specific prior written permission.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE.
Compile and Run
Compile for CUDA
Inside the source directory, run:
mkdir build
cd build
# build for NVIDIA architecture sm_35
cmake -DCMAKE_CUDA_ARCHITECTURES=35 ..
make
Compile for HIP
Inside the source directory, run:
mkdir build
cd build
# build for NVIDIA architecture MI2XX
cmake -DCUDA_MEMTEST_BACKEND=hip -DGPU_TARGETS=gfx90a ..
make
Note:
- In CMake,
..
is the path to the source directory. - You can find the architecture for your NVIDIA GPU on this site.
We also provide the package cuda-memtest
in the Spack package manager .
Run
cuda_memtest
The default behavior is running the test on all the GPUs available infinitely. There are options to change the default behavior.
cuda_memtest --disable_all --enable_test 10
cuda_memtest --stress
This runs test 10 (the stress test). --stress
is equivalent to --disable_all --enable_test 10 --exit_on_error
cuda_memtest --stress --num_iterations 100 --num_passes 1
This one does a quick sanity check for GPUs with a short run of test 10. More on this later.
See help message by
cuda_memtest --help
Sanity Check
There is a simple script sanity_check.sh
in the directory.
This script does a quick check if one GPU or all GPUs are in bad health.
Example usage:
# copy the cuda_memtest binary first into the same location as this script, e.g.
cd ..
mv build/cuda_memtest .
./sanity_check.sh 0 //check GPU 0
./sanity_check.sh 1 //check GPU 1
./sanity_check.sh //check All GPUs in the system
Fork note: We just run the cuda_memtest
binary directly.
Consider this script as a source for inspiration, or so.
Known Issues
-
Even if you compile with AMD HIP the tool binary will be named
cuda_memtest
. -
If you run on AMD GPUs via HIP the tool will mention everywhere CUDA instead of HIP.
-
We are not maintaining the OpenCL version of this code base. Pull requests restoring and updating the OpenCL capabilities are welcome.
Test Descriptions
List of all Tests
Running
cuda_memtest --list_tests
will print out all tests and their short descriptions, as of 6/18/2009, we implemented 11 tests
Test0 [Walking 1 bit]
Test1 [Own address test]
Test2 [Moving inversions, ones&zeros]
Test3 [Moving inversions, 8 bit pat]
Test4 [Moving inversions, random pattern]
Test5 [Block move, 64 moves]
Test6 [Moving inversions, 32 bit pat]
Test7 [Random number sequence]
Test8 [Modulo 20, random pattern]
Test9 [Bit fade test] ==disabled by default==
Test10 [Memory stress test]
The General Algorithm
First a kernel is launched to write a pattern. Then we exit the kernel so that the memory can be flushed. Then we start a new kernel to read and check if the value matches the pattern. An error is recorded if it does not match for each memory location. In the same kernel, the complement of the pattern is written after the checking. The third kernel is launched to read the value again and checks against the complement of the pattern.
Detailed Description
Test 0 [Walking 1 bit]
This test changes one bit a time in memory address to see it
goes to a different memory location. It is designed to test
the address wires.
Test 1 [Own address test]
Each Memory location is filled with its own address. The next kernel checks if the
value in each memory location still agrees with the address.
Test 2 [Moving inversions, ones&zeros]
This test uses the moving inversions algorithm with patterns of all
ones and zeros.
Test 3 [Moving inversions, 8 bit pat]
This is the same as test 1 but uses a 8 bit wide pattern of
"walking" ones and zeros. This test will better detect subtle errors
in "wide" memory chips.
Test 4 [Moving inversions, random pattern]
Test 4 uses the same algorithm as test 1 but the data pattern is a
random number and it's complement. This test is particularly effective
in finding difficult to detect data sensitive errors. The random number
sequence is different with each pass so multiple passes increase effectiveness.
Test 5 [Block move, 64 moves]
This test stresses memory by moving block memories. Memory is initialized
with shifting patterns that are inverted every 8 bytes. Then blocks
of memory are moved around. After the moves
are completed the data patterns are checked. Because the data is checked
only after the memory moves are completed it is not possible to know
where the error occurred. The addresses reported are only for where the
bad pattern was found.
Test 6 [Moving inversions, 32 bit pat]
This is a variation of the moving inversions algorithm that shifts the data
pattern left one bit for each successive address. The starting bit position
is shifted left for each pass. To use all possible data patterns 32 passes
are required. This test is quite effective at detecting data sensitive
errors but the execution time is long.
Test 7 [Random number sequence]
This test writes a series of random numbers into memory. A block (1 MB) of memory
is initialized with random patterns. These patterns and their complements are
used in moving inversions test with rest of memory.
Test 8 [Modulo 20, random pattern]
A random pattern is generated. This pattern is used to set every 20th memory location
in memory. The rest of the memory location is set to the complement of the pattern.
Repeat this for 20 times and each time the memory location to set the pattern is shifted right.
Test 9 [Bit fade test, 90 min, 2 patterns]
The bit fade test initializes all of memory with a pattern and then
sleeps for 90 minutes. Then memory is examined to see if any memory bits
have changed. All ones and all zero patterns are used. This test takes
3 hours to complete. The Bit Fade test is disabled by default
Test 10 [memory stress test]
Stress memory as much as we can. A random pattern is generated and a kernel of large grid size
and block size is launched to set all memory to the pattern. A new read and write kernel is launched
immediately after the previous write kernel to check if there is any errors in memory and set the
memory to the complement. This process is repeated for 1000 times for one pattern. The kernel is
written as to achieve the maximum bandwidth between the global memory and GPU.
This will increase the chance of catching software error. In practice, we found this test quite useful
to flush hardware errors as well.