Pipeline
Pipeline是一种非常重要的并行策略,我们以一个小例子简单说明一下:
for(unsigned i = 0; i < 1024; i++){ y[i] = (a[i] + b[i] + c[i] + d[i] + e[i] + f[i] + g[i] + h[i]) >> 3;}
顺序执行:
pipeline-11
Pipeline执行:
pipeline-12
假设一步操作需要一个cycle
,loop
迭代一次需要8个cycle
。
那么顺序执行需要8*1024个cycle
,而pipeline
只需要8+1024个cycle(从第8个cycle
开始,每个cycle
输出一个结果)。
接下来,从pipeline
执行的图示中提取完整的一列:
pipeline-13
绘制下图来表示整个loop
的执行情况:
pipeline-14
Pipeline Stage
上面的例子中,每一步操作为一个pipeline stage
,那么,这个例子里共有8个pipeline stage
:
pipeline-15
Altera OpenCL SDK 对pipeline的优化
实际上,编译器在生成pipeline
结构时可以更加灵活,比如下面的例子:
C = (A >> 5) + B;F = (D – E) << 3;G = C + F;
根据手册, SDK会将上面的代码例化为下面的结构,把C和F的生成看成两条独立的线索。这样,每个cycle都能得到一个C和F,输出一个G。
pipeline-16
pipeline-17
常用术语
Loop Trip count:Loop的总迭代次数。
上面的例子中,loop_Trip_count=1024。Loop Latency:loop执行一次完整迭代需要的时钟周期数。
Loop Initiation Interval(II):loop两次迭代之间的时钟周期数。
pipeline-18
所以,执行一个完整loop所需时钟周期数为:
对于嵌套循环:
for(unsigned i=0; i<N; i++){ ... for(unsigned j=0; j<M; j++){ ... }}
总的时钟周期数应为:
参考
Intel FPGA SDK for OpenCL Best Practices Guide
-长按关注-
本文分享自微信公众号 - AI异构(gh_ed66a0ffe20a)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。