Profiler中的cudaErrorIllegalAdress

时间:2015-03-25 13:52:57

标签: c++ cuda thrust illegalaccessexception

我有一个CUDA程序,它在某些地方使用推力,但也使用正常的内核。

问题是:当我独立运行程序时,一切正常。当我在探查器(Visual profiler或nvprof cmd行)中运行它时,程序在具有cudaErrorIllegalAdress错误的thrust :: inclusive_scan操作中崩溃。崩溃始终发生在探查器中并始终位于相同位置。此外,我有多个迭代,如:

void foo(){ cudaProfilerStart();
  for(...){//...
    thrust::inclusive_scan(...);//...
  }
  cudaProfilerStop();
}
for(...) foo();

崩溃总是在第二次迭代中第一次调用inclusive_scan时发生。

我正在使用Quadro K5000在Win7上使用CUDA 6.5。

任何可能导致此问题或如何缩小范围的想法?也许是一种获取失败访问地址的方法? cuda-memcheck不能与nvprof AFAIK(?)

一起使用

如果我删除了对cudaProfilerStart / Stop的调用,它似乎工作正常。奇怪的是,今天早上DID工作与他们虽然我没有引入任何更改(做了一些代码编辑,但通过git还原了一切)如果我禁用/启用profile-from-start(使用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;
}

更多场景:
开始(); FOO();停止(); foo()崩溃 开始(); FOO();停止();开始(); foo()OK
开始(); FOO();停止(); any_other_kernel();开始(); foo()崩溃

1 个答案:

答案 0 :(得分:0)

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

[这个答案已经从评论中汇总并作为社区维基条目添加,以便将问题从未答复的队列中删除]