【发布时间】:2016-03-05 22:36:33
【问题描述】:
我很困惑,我知道 CUDA 和其他库允许使用模板结构作为函子。因此,我为神经网络类设计了其中的一些:
struct sigmoid
{
sigmoid()=default;
__device__ float operator()(const float x) const
{
float exp_val = __expf(-x);
float denom = __fadd_rz(1.f,exp_val);
return __fdividef(1.f,denom);
}
};
当我将它用于 CUDA 内核时,它的用法有点简单:
activate<sigmoid><<num_blocks_x,block_threads_x>>>(sigmoid(),output_ptr);
为:
template <typename F>
__global__ void activate(F const& func, float * input)
{
int x = blockIdx.x * blockDim.x + threadIdx.x;
input[x] = func(input[x]);
}
但是我想将函数模板包裹调用CUDA内核的方法,然后转发给它:
template <class A>
thrust::host_vector<float> propagate (
A func,
thrust::device_vector<float> & input
) const;
我已经将它实现到一个单独的头文件中,它包含在声明类的头文件的末尾。
class ann
{
...
};
#include ann_imp.hpp
还有 imp 标头:
template <class A> inline
__host__ thrust::host_vector<float> ann::propagate (
A func,
thrust::device_vector<float> & input
) const
{
activate<func><<<num_blocks_x,block_threads_x>>>(func(),output_ptr);
}
然而,当我调用实际的 propagate 方法时,我遇到了麻烦:
net.propagate<sigmoid>( sigmoid(), in_vec1 );
生产:
error: function "sigmoid::operator()" cannot be called with the given argument list
object type is: sigmoid
当我不使用 operator() 而只使用类型名时:
xor_net.propagate<sigmoid>( sigmoid, in_vec1 );
我明白了:
error: type name is not allowed
使用实际对象会产生相同的错误:
sigmoid func;
xor_net.propagate<sigmoid>( func, in_vec1 );
我尝试过使用 A const& func 等参数,但无济于事。
如何传递一个 struct functor,然后将其转发给 CUDA 内核?
编辑 没有包装器,只需要调用激活函数:
activate<sigmoid><<<num_blocks_x,block_threads_x>>>(sigmoid(),output_ptr);
【问题讨论】: