以下代码来自Converting thrust::iterators to and from raw pointers
的答案编译好了,但是在CUDA 6.0下运行时,它会在exclusive_scan之后报告thrust :: system :: system_error(跟踪堆栈中充满了exclusive_scan相关信息)
#include <cuda_runtime.h>
#include <thrust/device_ptr.h>
#include <thrust/device_vector.h>
#include <thrust/scan.h>
#include <thrust/fill.h>
#include <thrust/copy.h>
#include <cstdio>
#pragma comment(lib,"cudart.lib")
int main()
{
const int N = 16;
int * a;
cudaMalloc((void**)&a, N*sizeof(int));
thrust::device_ptr<int> d = thrust::device_pointer_cast(a);
thrust::fill(d, d+N, 2);
thrust::device_vector<int> v(N);
thrust::exclusive_scan(d, d+N, v.begin());
int v_[N];
thrust::copy(v.begin(), v.end(), v_);
for(int i=0; i<N; i++)
printf("%d %d\n", i, v_[i]);
return 0;
}
代码中出了什么问题?(代码是2年前发布的,回答它的人说它运行正常。我认为他使用的是CUDA 4.0或更低版本。但是代码失败了在CUDA之后运行5.0)我使用VS 2012和CUDA 6.0(compute_13,sm_13)
答案 0 :(得分:2)
您正在编译正在添加-G
开关的调试项目。这可以是problematic with Thrust。切换到发布项目,该项目将删除-G
开关。
我尝试了以下组合:
-G -arch=sm_20
-arch=sm_20
-arch=sm_13
以及所有生成的代码都运行正常。
当我这样做时:
-G -arch=sm_13
我能够重现您所看到的错误。 (对CUDA 6的所有测试)