Exclusive_scan 中的 CUDA 推力推力::system::system_error

Posted

技术标签:

【中文标题】Exclusive_scan 中的 CUDA 推力推力::system::system_error【英文标题】:CUDA thrust thrust::system::system_error in exclusive_scan 【发布时间】:2014-07-01 22:07:24 【问题描述】:

以下代码来自Converting thrust::iterators to and from raw pointers的回答

编译正常,但是在CUDA 6.0下运行时,exclusive_scan后报thrust::system::system_error(trace stack中满是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 之后无法运行)我' m 使用 VS 2012 和 CUDA 6.0 (compute_13,sm_13)

【问题讨论】:

【参考方案1】:

您正在编译添加-G 开关的调试项目。这可以是problematic with Thrust。切换到发布项目,这将删除-G 开关。

我尝试了以下组合:

-G -arch=sm_20
-arch=sm_20
-arch=sm_13

以及所有运行正常的生成代码。

当我这样做时:

 -G -arch=sm_13

我能够重现您看到的错误。 (CUDA 6 上的所有测试)

【讨论】:

以上是关于Exclusive_scan 中的 CUDA 推力推力::system::system_error的主要内容,如果未能解决你的问题,请参考以下文章

将 cv::cuda::GpuMat 与推力和测试推力 API 一起使用时出现问题

cuda 推力::for_each 与推力::counting_iterator

在我的机器上操作大向量时,CUDA 推力很慢

推力 CUDA 找到每组(段)的最大值

您如何构建示例 CUDA 推力设备排序?

解决推力/CUDA 警告“无法分辨指针指向的...”