我有一个 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() 崩溃