推力异常:"thrust::system::system_error at memory location 0x00000000"
Thrust exception: "thrust::system::system_error at memory location 0x00000000"
我使用 class device_vector 编写了 CUDA 内核 assign() 的代码进行初始化一个向量。此内核由 class 成员函数启动,作为问题的解决方案:
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 工具包 7.5。
代码 initTest.cu 确实可以编译,但会抛出引用文件 [ 的异常=35=]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;
}
这是非法的:
__global__ void assign(float *x, const float &constant, const unsigned int &n)
^ ^
内核参数不能按引用传递。
当我删除 & 符号时:
__global__ void assign(float *x, const float constant, const unsigned int n)
你的代码对我来说运行正确。
我建议您使用 proper cuda error checking。这样做会使您的注意力集中在内核上。相反,直到 thrust 检测到错误并抛出一个 system_error
才发现错误,这无助于识别错误的来源。
我使用 class device_vector 编写了 CUDA 内核 assign() 的代码进行初始化一个向量。此内核由 class 成员函数启动,作为问题的解决方案:
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 工具包 7.5。
代码 initTest.cu 确实可以编译,但会抛出引用文件 [ 的异常=35=]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;
}
这是非法的:
__global__ void assign(float *x, const float &constant, const unsigned int &n)
^ ^
内核参数不能按引用传递。
当我删除 & 符号时:
__global__ void assign(float *x, const float constant, const unsigned int n)
你的代码对我来说运行正确。
我建议您使用 proper cuda error checking。这样做会使您的注意力集中在内核上。相反,直到 thrust 检测到错误并抛出一个 system_error
才发现错误,这无助于识别错误的来源。