Profiler 中的 cudaErrorIllegalAdress

cudaErrorIllegalAdress in Profiler

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

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

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

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

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

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

一起使用

如果我删除对 cudaProfilerStart/Stop 的调用,它似乎工作正常。很奇怪,今天早上它确实与他们一起工作,尽管我没有引入任何更改(进行了一些代码编辑但通过 git 恢复了所有内容)而且如果我 disable/enable 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() 好
开始();富();停止(); any_other_kernel();开始(); foo() 崩溃

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

[此答案已从评论中汇集并添加为社区 wiki 条目以将问题从未回答的队列中删除]