C++ CUDAERRORILLEGALADRENT在分析器中

C++ CUDAERRORILLEGALADRENT在分析器中,c++,cuda,thrust,illegalaccessexception,C++,Cuda,Thrust,Illegalaccessexception,我有一个CUDA程序,在某些地方使用推力,但也使用普通内核 问题是:当我独立运行程序时,一切正常。当我在探查器(VisualProfiler或nvprof cmd行)中运行它时,该程序在一个带有CUDAerrorillegalaAddress错误的推力::inclusive_扫描操作中崩溃。碰撞始终发生在探查器中,并且始终发生在同一位置。此外,我有多个迭代,如: void foo(){ cudaProfilerStart(); for(...){//... thrust::inclu

我有一个CUDA程序,在某些地方使用推力,但也使用普通内核

问题是:当我独立运行程序时,一切正常。当我在探查器(VisualProfiler或nvprof cmd行)中运行它时,该程序在一个带有CUDAerrorillegalaAddress错误的推力::inclusive_扫描操作中崩溃。碰撞始终发生在探查器中,并且始终发生在同一位置。此外,我有多个迭代,如:

void foo(){ cudaProfilerStart();
  for(...){//...
    thrust::inclusive_scan(...);//...
  }
  cudaProfilerStop();
}
for(...) foo();
崩溃总是在第二次迭代中第一次调用inclusive_scan时发生

我用Quadro K5000在Win7上使用CUDA 6.5

有什么想法可以导致这种情况或如何缩小它?也许是一种获取失败访问地址的方法?cuda memcheck不能与nvprof AFAIK(?)一起使用

如果我删除对CUDAPROFILERSSTART/Stop的调用,它似乎工作正常。奇怪的是,虽然我没有引入任何更改(进行了一些代码编辑,但通过git还原了所有内容),但今天早上它确实可以与他们一起工作。如果我从一开始就禁用/启用配置文件(cudaProfilerStart/Stop已就位),行为也不会改变

最简单的工作示例:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>
#include <thrust/device_vector.h>
#include <cuda_profiler_api.h>

void foo(){
  thrust::device_vector<int> d_in(100), d_out(100);
  thrust::inclusive_scan(d_in.begin(), d_in.end(), d_out.begin());
  cudaError_t res = cudaDeviceSynchronize();
  std::cout << cudaGetErrorString(res) << std::endl;
}

int main(){
  cudaProfilerStart();
  foo();
  cudaProfilerStop();
  foo(); // Crash here

  cudaDeviceReset();

  return 0;
}
#包括“cuda_runtime.h”
#包括“设备启动参数.h”
#包括
#包括
#包括
void foo(){
推力:装置矢量d_in(100),d_out(100);
推力:包含扫描(d_-in.begin()、d_-in.end()、d_-out.begin());
cudaError_t res=cudaDeviceSynchronize();

std::cout此行为似乎是由于CUDA 7.0和更早版本的探查器系统中的限制。CUDA 7.5版本工具包中将提供修复程序


[此答案由评论汇总而成,并作为社区wiki条目添加,以将问题从未回答的队列中删除]

您是在visual studio中构建调试项目还是在visual studio中构建发布项目?两者都有。在调试模式下,推力引发异常,在发布模式下,cudaGetErrorString返回错误这似乎是探查器系统中的一个缺陷。这可能会在CUDA的下一个主要版本(CUDA 7.5)中修复