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 条目以将问题从未回答的队列中删除]
我有一个 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 条目以将问题从未回答的队列中删除]