如何在设备中使用主机功能?
例如,在下面的函数中,我想返回一个值
__device__ float magnitude2( void ) {
return r * r + i * i;
}
但是这个功能是一个设备功能,我收到了这个错误:
calling a host function from a __device__/__global__ function is not allowed
这个问题的最佳方法是什么?
对代码的额外评论:
我想定义这个结构:
struct cuComplex {
float r;
float i;
cuComplex( float a, float b ) : r(a), i(b) {}
__device__ float magnitude2( void ) {
return r * r + i * i;
}
__device__ cuComplex operator*(const cuComplex& a) {
return cuComplex(r*a.r - i*a.i, i*a.r + r*a.i);
}
__device__ cuComplex operator+(const cuComplex& a) {
return cuComplex(r+a.r, i+a.i);
}
};
答案 0 :(得分:2)
现在我们知道这个问题涉及C ++结构,答案是显而易见的 - 类的构造函数也必须作为__device__函数可用,以便能够在内核中实例化类。在您的示例中,结构应该像这样定义:
struct cuComplex {
float r;
float i;
__device__ __host__
cuComplex( float a, float b ) : r(a), i(b) {}
__device__
float magnitude2( void ) {
return r * r + i * i;
}
__device__
cuComplex operator*(const cuComplex& a) {
return cuComplex(r*a.r - i*a.i, i*a.r + r*a.i);
}
__device__
cuComplex operator+(const cuComplex& a) {
return cuComplex(r+a.r, i+a.i);
}
};
您看到的错误是因为每当实例化类时都需要调用构造函数。在原始代码中,构造函数仅被声明为宿主函数,从而导致编译错误。