首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Intel OpenCL 之 Pipeline(一):基本概念

Pipeline

Pipeline是一种非常重要的并行策略,我们以一个小例子简单说明一下:

代码语言:javascript
复制
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

假设一步操作需要一个cycleloop迭代一次需要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结构时可以更加灵活,比如下面的例子:

代码语言:javascript
复制
C = (A >> 5) + B;
F = (D – E) << 3;
G = C + F;

根据手册, SDK会将上面的代码例化为下面的结构,把C和F的生成看成两条独立的线索。这样,每个cycle都能得到一个C和F,输出一个G。

pipeline-16

pipeline-17

常用术语

  1. Loop Trip count:Loop的总迭代次数。 上面的例子中,loop_Trip_count=1024。
  2. Loop Latency:loop执行一次完整迭代需要的时钟周期数
  3. Loop Initiation Interval(II):loop两次迭代之间的时钟周期数

pipeline-18

所以,执行一个完整loop所需时钟周期数为:

对于嵌套循环:

代码语言:javascript
复制
for(unsigned i=0; i<N; i++){
  ...
  for(unsigned j=0; j<M; j++){
    ...
  }
}

总的时钟周期数应为:

参考

Intel FPGA SDK for OpenCL Best Practices Guide

下一篇
举报
领券