具有模板方法id的模板类



我试图为我的方法创建一个标识符。这个标识符对我的工作很重要,因为它实际上是硬件合成。

我有以下模板类:

template <int FF_COUNT, int FB_COUNT, int NEXT_COUNT>
class Core{
public:
...
template<int id> void consume_fb_events (hls::stream<event>  feedback_stream [FB_COUNT] [FB_COUNT], weight w_mem [128*128]);
}


template <int FF_COUNT, int FB_COUNT, int NEXT_COUNT>
template <int id>
void Core<FF_COUNT, FB_COUNT, NEXT_COUNT>::consume_fb_events (hls::stream<event> feedback_stream [FB_COUNT] [FB_COUNT], weight w_mem [128*128]){
#pragma HLS INLINE off
event e;   
for(int i = 0 ; i < FB_COUNT ; i++) {
while (!feedback_stream[id][i].empty()) {
feedback_stream[id][i].read(e);
ap_uint<16> mem_offset = e << size_exp;
consume_event (e, mem_offset, w_mem);    
}
}
}

这是我的函数调用

#define sth 8
for int i = 0 ; i < sth; i++
core[i].consume_fb_events<i>(....);

我得到编译错误:

ERROR: [HLS 200-70] Compilation errors found: In file included from c1/srnn.cpp:1:
c1/srnn.cpp:197:14: error: no matching member function for call to 'consume_fb_events'
core_1[i].consume_fb_events<i>(buffer_layer1_1, w1[i]);
~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
c1/core.h:52:24: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'id'
template<int id> void consume_fb_events (hls::stream<event> feedback_stream [FB_COUNT] [FB_COUNT], weight w_mem [128*128]);
^

您要找的是编译时的for循环。因为模板形参必须是constexpr。我通常这样做,因为你不能在constexpr函数中使用for循环:

template<int i>
struct MyFunc
{
MyFunc()
{
// do something with i
core[i].consume_fb_events<i>(....);
}
};
template<int end, template <int I> class func, int i = 0>
struct ForLoop
{
ForLoop()
{
func<i>{};
ForLoop<end, func, i+1>{};
}
};
template<int end, template <int I> class func>
struct ForLoop<end, func, end>
{
ForLoop()
{
}
};

您可以在MyFunc的构造函数中运行任何代码。

你可以这样执行:

ForLoop<8, MyFunc>{};

这里8是你通常使用的数字但是在for循环的i < ...部分

你必须小心这一点,因为这只适用于end高达约900(取决于最大模板递归深度)。否则你将得到一个编译时错误。

使用std::cout 的实例编辑:


既然@SherifBadawy在评论中问,你不必声明一个结构体/类MyFunc来做到这一点,但我采用了这种方法,因为它使ForLoop更加动态,你可以多次重用它。

但是如果你想这样也可以:

template<int i>
void foo()
{
// code here
}
template<int end, int i = 0>
struct ForLoop
{
ForLoop()
{
core[i].consume_fb_events<i>(....);
// more code
// or ...
foo<i>();
ForLoop<end, func, i+1>{};
}
};
template<int end>
struct ForLoop<end, end>
{
ForLoop()
{
}
};

要运行ForLoop,您将再次执行:

ForLoop<8>{}; // without passing a class or function

最新更新