C ++结构函子作为函数模板参数

Ælex

我很困惑,我知道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 );

我试过使用参数wasA const& func等,但无济于事。

如何传递结构函子,然后将其转发到CUDA内核?

编辑没有包装,调用激活功能根本要求:

activate<sigmoid><<<num_blocks_x,block_threads_x>>>(sigmoid(),output_ptr); 
萨胡

你有:

 __device__ float operator()(const float x) const ...

该函数需要一个类型为的参数float您通过以下方式调用它ann::propagate

activate<func><<<num_blocks_x,block_threads_x>>>(func(),output_ptr);
                                                 ^^^^^^

我认为该行必须为:

activate<A><<<num_blocks_x,block_threads_x>>>(func,output_ptr);
       ^^^^                                   ^^^^^     
       Fix the type                           Use the object.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++:函数指针作为模板参数而不是函子

来自分类Dev

C ++:函数指针作为模板参数而不是函子

来自分类Dev

函子中的C ++ 11可变参数模板解压缩参数

来自分类Dev

C ++模板函数别名作为可变参数模板参数

来自分类Dev

C ++模板函数别名作为可变参数模板参数

来自分类Dev

使用默认参数的C ++函数模板

来自分类Dev

C++ 函数模板:必须使用 & 作为参数类型和返回类型吗?

来自分类Dev

线性层次结构的C ++可变参数模板参数

来自分类Dev

模板参数上的C ++函数模板重载

来自分类Dev

C ++中没有参数可变参数模板函数

来自分类Dev

C ++模板自身名称作为相同模板结构函数内部的模板模板参数传递

来自分类Dev

C ++模板函数,在仍允许内联的同时指定回调函子/ lambda的参数类型?

来自分类Dev

C ++使用可变参数模板绑定成员函数

来自分类Dev

用可变参数模板在C ++中包装函数指针

来自分类Dev

C ++中转换函数模板参数推导的含义

来自分类Dev

通过可变参数模板的C ++ 11构造函数继承

来自分类Dev

参数可以在C ++的函数模板中转换吗?

来自分类Dev

C ++:可变参数模板和函数重载

来自分类Dev

调用类内的函数的C ++ 11可变参数模板

来自分类Dev

C ++函数模板需要&用于数组参数

来自分类Dev

通过可变参数模板的C ++ 11构造函数继承

来自分类Dev

不带有任意参数的c ++函数模板

来自分类Dev

C ++ 11可变参数模板函数存储

来自分类Dev

C ++可变参数模板:无法匹配函数

来自分类Dev

在C函数中将结构作为参数传递

来自分类Dev

线程结构作为函数参数C

来自分类Dev

在C函数中将结构作为参数传递

来自分类Dev

C ++重载函数作为模板参数

来自分类Dev

C ++函数模板格式

Related 相关文章

热门标签

归档