检查失败:错误==cudaSuccess(77对0)遇到非法内存访问

检查失败:错误==cudaSuccess(77对0)遇到非法内存访问,cuda,Cuda,我正在调试一些涉及cuda操作的冗长代码。 我目前在调用cudaMemcpy…,…,cudaMemcpyHostToDevice时收到上述错误,但我不确定它是否与此相关 以下是一段代码片段: int num_elements = 8294400; // --> I also tried it with "1" here which didn't work either! float *checkArray = new float[num_elements]; flo

我正在调试一些涉及cuda操作的冗长代码。 我目前在调用cudaMemcpy…,…,cudaMemcpyHostToDevice时收到上述错误,但我不确定它是否与此相关

以下是一段代码片段:

    int num_elements = 8294400; // --> I also tried it with "1" here which didn't work either!
    float *checkArray = new float[num_elements];
    float *checkArray_GPU;
    CUDA_CHECK(cudaMalloc(&checkArray_GPU, num_elements * sizeof(float)));
    CUDA_CHECK(cudaMemcpy(checkArray_GPU, checkArray, num_elements * sizeof(float), cudaMemcpyHostToDevice));
    CUDA_CHECK(cudaMemcpy(checkArray, checkArray_GPU, num_elements * sizeof(float), cudaMemcpyDeviceToHost));    
CUDA_CHECK只是一个用于打印任何CUDA错误的宏,这是现有代码的一部分,适用于所有其他cudaMemcpy或cudaMalloc调用,因此它不是问题的一部分。奇怪的是,这个代码片段在toy*.cu示例中单独执行,效果很好

因此,我的假设是,由于程序中以前的cuda操作,出现了一些未报告的错误,导致上述代码段中出现错误。可能是这样吗? 有没有办法检查cuda是否存在未报告的错误

我的另一个估计是,它可能来自我正在使用的特定图形卡。我有一个Nvidia Titan X Pascal、Cuda 8.0和cudnn v5.1。我还试着用like编译我的代码

但到目前为止,这并没有起到任何作用。以下是我当前的简化Makefile,以确保完整性:

NVCC = nvcc
CUDA_INC = -I/usr/local/cuda/include 
CUDA_LIB = -L/usr/local/cuda/lib64
TARGET = myProgramm
OPTS = -std=c++11
$(TARGET).so: $(TARGET).o
    $(NVCC) $(OPTS) -shared $(TARGET).o $(CUDA_LIB) -o $(TARGET).so
$(TARGET).o: $(TARGET).cu headers/some_header.hpp 
    $(NVCC) $(OPTS) $(CUDA_INC) -Xcompiler -fPIC -c $(TARGET).cu 
有人知道我该怎么查清楚这件事吗

编辑: cuda memcheck是一个好主意,因此在调用Kernel_set_值的过程中,错误明显发生在前面:


因此,最终的解决方案是编译代码时不带任何-gencode=arch=compute\u XX,code=sm\u XX样式的标志。我花了很长时间才发现这一点。实际的错误代码是非常错误的错误=CUDASCUCess 77对0非法存储器访问,4对0未指定的启动失败或8对0无效的设备函数< /P>是NUMYCROPIX体素等于NUMLY元素吗?是的,我将用CUDAMEMCHECK编辑您的代码。我看不出任何人在不知道什么是Kernel\u set\u value,或者它的代码是什么样子,或者您正在处理什么代码的情况下,如何回答这个问题。当您请求调试帮助时,您应该提供一个。另外,使用cuda memcheck,您可以按照示例让cuda memcheck识别发生错误的内核代码的特定行。对不起,我认为kernel_set_值是一个基本的cuda函数。由于您提示使用-lineinfo选项编译,我可以本地化相应的函数。由于错误消息是地址。。。超出范围,我将再次检查代码,检查所有数组维度。。。这个错误已经让我比以前走得更远了。我现在可以更好地定位错误,而不是使用原始错误消息error==cudaSuccess 77 vs.0。在回答这个问题之前,您从未提到过无效的设备功能。该错误代码几乎总是表示编译错误的体系结构,删除所有体系结构开关将默认为sm_20编译,这是最不受限制的。但是,您提到的其他错误代码非法内存访问和未指定的启动失败与其他问题有关。把它们放在一起,暗示它们都是由于编译arch开关选择造成的,这完全是不正确的。
NVCC = nvcc
CUDA_INC = -I/usr/local/cuda/include 
CUDA_LIB = -L/usr/local/cuda/lib64
TARGET = myProgramm
OPTS = -std=c++11
$(TARGET).so: $(TARGET).o
    $(NVCC) $(OPTS) -shared $(TARGET).o $(CUDA_LIB) -o $(TARGET).so
$(TARGET).o: $(TARGET).cu headers/some_header.hpp 
    $(NVCC) $(OPTS) $(CUDA_INC) -Xcompiler -fPIC -c $(TARGET).cu 
========= Invalid __global__ write of size 4
=========     at 0x00000298 in void Kernel_set_value<float>(unsigned long, unsigned long, float*, float)
=========     by thread (480,0,0) in block (30,0,0)
=========     Address 0x0005cd00 is out of bounds
=========     Saved host backtrace up to driver entry point at kernel launch time
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so.1 (cuLaunchKernel + 0x2c5) [0x209035]
[...]
=========     Host Frame:/media/.../myProgramm.so (_ZN5boost6python6detail6invokeIiPFvRKSsENS0_15arg_from_pythonIS4_EEEEP7_objectNS1_11invoke_tag_ILb1ELb0EEERKT_RT0_RT1_ + 0x2d) [0x3e5eb]
[...]
=========
========= Program hit cudaErrorLaunchFailure (error 4) due to "unspecified launch failure" on CUDA API call to cudaMemcpy. 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so.1 [0x2f4e33]
=========     Host Frame:/media/.../myProgramm.so [0x7489f]
F0703 16:23:54.840698 26207 myProgramm.cu:411] Check failed: error == cudaSuccess (4 vs. 0)  unspecified launch failure
[...]
=========     Host Frame:python (Py_Main + 0xb5e) [0x66d92]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xf5) [0x21f45]
=========     Host Frame:python [0x177c2e]
=========
*** Check failure stack trace: ***
========= Error: process didn't terminate successfully
========= Internal error (20)
========= No CUDA-MEMCHECK results found
#define CUDA_NUM_THREADS 512
#define MAX_NUM_BLOCKS 2880

inline int CUDA_GET_BLOCKS(const size_t N) {
  return min(MAX_NUM_BLOCKS, int((N + size_t(CUDA_NUM_THREADS) - 1) / CUDA_NUM_THREADS));
}

inline size_t CUDA_GET_LOOPS(const size_t N) {
  size_t total_threads = CUDA_GET_BLOCKS(N)*CUDA_NUM_THREADS;
  return (N + total_threads -1)/ total_threads;
}

template <typename Dtype>
__global__ void Kernel_set_value(size_t CUDA_NUM_LOOPS, size_t N, Dtype* GPUdst, Dtype value){
  const size_t idxBase = size_t(CUDA_NUM_LOOPS) * (size_t(CUDA_NUM_THREADS) * size_t(blockIdx.x) + size_t(threadIdx.x));
  if (idxBase >= N) return;
  for (size_t idx = idxBase; idx < min(N,idxBase+CUDA_NUM_LOOPS); ++idx ){
    GPUdst[idx] = value;
  }
}