2015-11-04 39 views
1

我写使用类device_vector用于初始化向量CUDA内核分配()这些代码的。这个内核是通过一个类的成员函数推出作为解决这样的问题:推力异常:“推力::系统:: SYSTEM_ERROR在存储器位置00000000”

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做参考。

“在0x775B5B68在initTest.exe第一次机会异常:微软C++异常:推力::系统:: SYSTEM_ERROR内存位置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 

定义的主要功能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

“但是,当我将它集成在一个更长的代码中”对不起,但您将不得不提供一些关于准确含义的细节。从编译的角度来看,这里显示的代码没有任何问题。你究竟如何将它整合到更长的代码中?你想''将这个文件包含在'.cpp'文件中,也许? (顺便提一句,你称之为“未解决”**的问题已经解决了。那里提出的解决方案是正确的。) –

+0

是的你是对的。我还没有尝试过单独的编译。当我说“更长的代码”时,我的意思是这段代码是另一段代码的一小部分。正如我所说,这段代码完美工作,我的问题是因为当我将它集成到该代码时,出现此错误。所以,这是与使用像这样启动内核的方法相同的主题。我不明白为什么什么时候分离它编译和集成它不。 – Vitrion

+0

对不起,我没跟着你。我会建议提供一个简短的,完整的例子** **不起作用**。那么有人可能会提供建议。现在你的问题只是包含一个很好的例子。我不认为这很有用。 –

回答

1

这是非法的:

__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。这样做会把注意力集中在内核上。相反,错误未被捕获,直到推力检测到并抛出一个system_error,这无助于确定错误的来源。

+0

非常感谢。我总是使用CUDA错误检查,但我删除了说明以保持示例简短。我工作,可能这是我的其他代码的解决方案。我会试试看。 – Vitrion