0

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

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

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

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

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

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

如果我删除对 cudaProfilerStart/Stop 的调用,它似乎工作正常。奇怪的是,它今天早上确实与他们一起工作,尽管我没有引入任何更改(进行了一些代码编辑,但通过 git 恢复了所有内容)此外,如果我禁用/启用 profile-from-start(使用 cudaProfilerStart/Stop in地方)

最小的工作示例:

#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;
}

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

4

1 回答 1

0

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

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

于 2015-10-25T06:06:59.090 回答