C++ 推力异常:“推力异常”;推力::系统::内存位置0x00000000处的系统“U错误”;

C++ 推力异常:“推力异常”;推力::系统::内存位置0x00000000处的系统“U错误”;,c++,cuda,thrust,C++,Cuda,Thrust,我使用类device\u vector来初始化向量,编写了CUDA内核assign()的代码。此内核由类成员函数启动,以解决以下问题: 根据 我使用的是GTX650Ti GPU、Windows 8.1、Visual Studio 2013社区和CUDA Toolkit 7.5 代码initTest.cu确实会编译,但会抛出一个异常,引用文件trial\u copy.inl 在微软.0x775 B5B68中的第一个机会例外:微软C++异常:推力::St::StulyStor在内存位置0x011

我使用类device\u vector来初始化向量,编写了CUDA内核assign()的代码。此内核由类成员函数启动,以解决以下问题:

根据

我使用的是GTX650Ti GPU、Windows 8.1、Visual Studio 2013社区和CUDA Toolkit 7.5

代码initTest.cu确实会编译,但会抛出一个异常,引用文件trial\u copy.inl

<0>在微软.0x775 B5B68中的第一个机会例外:微软C++异常:推力::St::StulyStor在内存位置0x0116F3C8。 如果有此异常的处理程序,则程序可以安全地继续。”

有人知道为什么会出现这个问题吗

头文件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
\ifndef FOO\u CUH
#定义FOO_CUH
#包括“cuda_runtime.h”
#包括“设备启动参数.h”
#包括
#包括
使用名称空间推力;
使用名称空间std;
__全局无效赋值(浮点*x,常量浮点和常量,常量无符号整数和n)
{
int i=blockDim.x*blockIdx.x+threadIdx.x;
if(i(原始指针转换(result.data())、值、样本);
复制(result.begin(),result.end(),domain.begin());
}
#恩迪夫
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;
}
#包括“foo.cuh”
#包括
int main()
{
fooa(10),;
a、 初始值(0.5);
for(无符号整数i=0;i
__global__ void assign(float *x, const float &constant, const unsigned int &n)
                                             ^                             ^
内核参数不能通过引用传递

当我移除符号时:

__global__ void assign(float *x, const float constant, const unsigned int n)
你的代码对我来说运行正常


我建议您使用。这样做会将您的注意力集中在内核上。相反,错误是未捕获的,直到推力检测到它并抛出一个
系统错误
,这无助于识别错误的来源。

“但是当我将它集成到一个较长的代码中时”很抱歉,但是您必须给出一些关于这到底意味着什么的详细信息。从编译的角度来看,您在这里显示的代码没有问题。您如何将其集成到较长的代码中?您是否试图将此文件包含在
.cpp
文件中?(顺便说一句,你称之为“未解决”的问题已经解决了。这里给出的解决方案是正确的。)是的,你说得对。我没有尝试过单独编译。当我说“更长的代码”时我的意思是,这段代码是另一段代码的一小部分。正如我所说,这段代码工作得很好,我的问题是,当我将它集成到那段代码中时,会出现这个错误。所以,这是同一个主题,即让一个类用一个方法启动这样一个内核。我不明白为什么当它被分离时,它会编译并集成,它不会这样rry我没有听你的。我建议你提供一个简短、完整的例子,说明一些不起作用的东西。然后很可能有人会提供建议。现在你的问题只是包含了一个很好的例子。我不认为这是有用的。我希望这个例子更清楚。我修改了程序,现在问题不同了租金。我跟你说实话,我更改代码希望找到相同的错误,但我总是发现不同的错误,这让我很困惑。对不起,我的英语现在是一个完全不同的问题。现在问题的标题与你所问的不符。非常感谢。我总是使用CUDA错误检查but我删除了说明以保持示例简短。我确实有效,可能这就是我代码其余部分的解决方案。我会尝试一下。