推力异常:“push :: system :: system_error at memory location 0x00000000”

时间:2015-11-04 01:39:42

标签: c++ cuda thrust

我使用类 device_vector 编写了CUDA Kernel assign()的代码来初始化向量。该内核由类成员函数启动,作为问题的解决方案:

CUDA kernel as member function of a class

并根据

https://devtalk.nvidia.com/default/topic/573289/mixing-c-and-cuda/

我正在使用GTX650Ti GPU,Windows 8.1,Visual Studio 2013社区和CUDA Toolkit 7.5。

代码 initTest.cu 会编译,但会引发异常,引用文件 trivial_copy.inl

“initTest.exe中0x775B5B68处的第一次机会异常:Microsoft C ++异常:在内存位置0x0116F3C8处的thrust :: system :: system_error。 如果存在此异常的处理程序,则可以安全地继续该程序。“

有谁知道为什么会出现这个问题?

标题文件 foo.cuh 是:

#ifndef FOO_CUH
#define FOO_CUH
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <thrust/device_vector.h>
#include <vector>
using namespace thrust;
using namespace std;

__global__ void assign(float *x, const float &constant, const unsigned int &n)
{
    int i = blockDim.x * blockIdx.x + threadIdx.x;
    if (i < n)
        x[i] = constant;
}
class foo
{
    public:
    foo(const unsigned int &);
    void init(const float &);
    vector<float> domain;
private:
    unsigned int samples;
};
foo::foo(const unsigned int &n)
{
    vector<float> result(n);
    domain = result;
    samples = n;
}
void foo::init(const float &value)
{
    device_vector<float> result(samples);
    assign <<< 1, domain.size() >>>(raw_pointer_cast(result.data()), value, samples);
    thrust::copy(result.begin(), result.end(), domain.begin());
}
#endif

并且 initTest.cu 中定义的主要功能是:

#include "foo.cuh"
#include <iostream>

int main()
{
    foo a(10);
    a.init(0.5);
    for (unsigned int i = 0; i < a.domain.size(); i++)
    {
        if (i == 0)
            cout << "{ ";
        else if (i == a.domain.size() - 1)
            cout << a.domain[i] << " }";
        else
            cout << a.domain[i] << ", ";
    }
    cin.get();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

这是非法的:

__global__ void assign(float *x, const float constant, const unsigned int n)

内核参数不能通过引用传递。

当我删除&符号时:

system_error

您的代码可以正常运行。

我建议您使用proper cuda error checking。这样做会将注意力集中在内核上。相反,错误没有被捕获,直到推测检测到它并抛出<html> <video src="http://techslides.com/demos/sample-videos/small.mp4" autoplay="autoplay" loop="loop" controls="controls" muted="muted" height="453" width="690"> Your browser does not support the video tag. </video> </html> ,这对于识别错误的来源没有帮助。