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

时间:2022-07-22
本文章向大家介绍Intel OpenCL 之 Pipeline(一):基本概念,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

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

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所需时钟周期数为:

对于嵌套循环:

for(unsigned i=0; i<N; i++){
  ...
  for(unsigned j=0; j<M; j++){
    ...
  }
}

总的时钟周期数应为:

参考

Intel FPGA SDK for OpenCL Best Practices Guide