HLS中的pingpang操作

乒乓操作

乒乓操作是一种数据流的优化方法,假设有两个任务task1,task2,task1产生数据,而task2接受task1产生的数据并进行处理,这就是一种数据流,若数据是按顺序流动的,则可以在task1和task2之间加入FIFO,从而实现任务级并行,加入HLS的data_flow指令并设置通道实现为FIFO即可。然而,当数据不是顺序访问时,FIFO就无法起作用了,这是可以在task1和task2之间加入两个buffer,乒乓操作如下,task1生产数据到buffer1,与此同时,task2消费buffer2中的数据,下一次,task1生产数据到buffer2,而task2消费buffer1中的数据,从而实现任务的并行执行。
HLS中同样用data_flow指令实现乒乓RAM,但是,data_flow使用限制比较多,而且不够灵活,下面给出一种自定义实现pingpang RAM的方法。
废话不说,直接上代码,应该很容易懂

#include"maxpool.h"

void compute(data_t buff_in[100],data_t buff_out[100]){
	int i;
	loop_i:for(i=0;i<100;i++)
		buff_out[i]=buff_in[i]+buff_in[i];
}
void load(data_t buff_in[100],int n,volatile data_t *in){
	memcpy((data_t*)buff_in,(const data_t*)(in+n*100),sizeof(data_t)*100);
}

void maxpool(volatile data_t* in,volatile data_t* out){
#pragma HLS INTERFACE m_axi depth=1000 port=in offset=slave bundle=IN
#pragma HLS INTERFACE m_axi depth=1000 port=out offset=slave bundle=OUT
#pragma HLS INTERFACE s_axilite port=return
	data_t buff_in1[100];
	data_t buff_in2[100];
	data_t buff_out[100];
	bool flag=0;
	loop:for(int i=0;i<10;i++){
		if(flag==1)
		{
			load(buff_in1,i,in);
			compute(buff_in2,buff_out);
		}
		else
		{
			load(buff_in2,i,in);
			compute(buff_in1,buff_out);
		}
		memcpy((data_t*)(out+i*100),(const data_t*)buff_out,sizeof(data_t)*100);
		flag=1-flag;
	}
}

至于为什么函数名为maxpool,那是因为这个方法是我在写池化层的时候突然想到的,没改函数名就直接写在这里了。

发布了23 篇原创文章 · 获赞 5 · 访问量 1587
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览