【问题标题】:cudaErrorIllegalAdress in ProfilerProfiler 中的 cudaErrorIllegalAdress
【发布时间】:2015-03-25 13:52:56
【问题描述】:

我有一个 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;
}

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

【问题讨论】:

  • 您是在构建调试项目还是在 Visual Studio 中构建发布项目?
  • 两者。在Debug模式下thrust抛出异常,在Release模式下cudaGetErrorString返回错误
  • 这似乎是分析器系统中的一个缺陷。它可能会在 CUDA 的下一个主要版本(CUDA 7.5)中得到修复

标签: c++ cuda thrust illegalaccessexception


【解决方案1】:

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

[此答案由 cmets 组装而成,并添加为社区 wiki 条目,以将问题从未回答队列中删除]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多