I was testing my CUDA code, using ‘cuda-memcheck.exe’. ‘cuda-memcheck.exe’ caused an illegal memory access if I set ‘–tools synccheck’ option to its command.
This error does not occur by thw following case.
- CUDA program runs without cuda-memcheck.exe
- ‘cuda-memcheck.exe’ run without ‘–tools synccheck’ option.
We can reproduce this problem by the following procedure.
-
Test environment.
OS : Windows 7 Professional, 64 bit edition
Compiler : VisualStudio 2010 Professional Version 10.0.40219.1 SP1
GPU : Tesla k20c
DisplayDriver: 358.87-desktop-win8-win7-winvista-64bit-international-whql
CUDA : CUDA 7.5 -
A Test code ‘test.cu’ as below.
#include <assert.h>
#include <cuda.h>
#include <cuda_runtime.h>
using namespace std;
global void cudaTestSync()
{
__syncthreads();
}
void gpuSyncTest()
{
dim3 thds(64, 1, 1);
dim3 blks(2000, 1, 1);
cudaTestSync<<<blks,thds,0>>>();
cudaError_t err;
err = cudaThreadSynchronize();
if(err != cudaSuccess) {
printf("cudaThreadSynchronize: %s\n", cudaGetErrorString(err));
}
err = cudaGetLastError();
if(err != cudaSuccess) {
printf("cudaGetLastError: %s\n", cudaGetErrorString(err));
}
}
int main()
{
gpuSyncTest();
return(0);
}
-
Compile test code.
C:> nvcc.exe -gencode=arch=compute_35,code="sm_35,compute_35" --cl-version 2010 ^
-ccbin “C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\x86_amd64” ^
-I"C:\Program Files\NVIDIA GPU ComputingToolkit\CUDA\v7.5\include" ^
-o test.exe test.cu -
Run program.
a) Test program, using cuda-memcheck.exe.
cuda-memcheck.exe returns correct result.C:> cuda-memcheck.exe ./test.exe
========= CUDA-MEMCHECK
========= ERROR SUMMARY: 0 errors
b) Test program, using cuda-memcheck.exe with ‘–tools synccheck’ option.
A test program caused an illegal memory access error.
C:\> cuda-memcheck.exe --tool synccheck ./test.exe
========= CUDA-MEMCHECK
cudaThreadSynchronize: an illegal memory access was encountered
cudaGetLastError: an illegal memory access was encountered
========= ERROR SUMMARY: 0 errors
Why cuda-memcheck.exe caused the error ?
best regards