Intel® FPGA SDK for OpenCL™ Pro Edition: 最佳实践实践指南

ID 683521
日期 9/26/2022
Public
文档目录

3.1. 内核

您的OpenCL系统中每个内核都由一组块表示。每个块内部都有一组非non-branching(非分支)指令,用于实现您的算法和离线编译器的循环编制(orchestration)逻辑。该块显示您内核的执行流程。有循环时,有一个back edge(回边)到此块或者其前一个块,具体取决于循环结构,例如嵌套循环。通常循环会施加II瓶颈,并且是优化的主要焦点。

一个块具有三个主要部分—一个输入或循环输入节点,一组指令和一个分支(branch)节点。可能不会出现输入和分支节点,具体取决于是否存在块的分支输入和输出。输入或循环输入节决定变量的初始值,具体取决于进入该块的分支起源于何处。该块的其余部分包含可停顿和不可停顿的指令以及集群。一个经过良好优化的设计应该包含最少数量的可停顿指令,例如可停顿I/O或存储器访问。

块内的不可停顿指令被分组成集群,以减少与可停顿指令的握手开销。一个集群有一个entry(入口)和一个exit(出口)节点。仅有一个无停顿集群。您可以在集群的出口节点中找到exit FIFO的信息。最后,分支节点通知下一个块在什么条件下才可以去。

HLD报告中,在Views下拉菜单下您可以找到您内核的各种视图。请参阅使用视图了解更多信息。

Intel® FPGA SDK for OpenCL™ Offline Compiler将不使用内置work-item函数的内核,例如get_global_id()get_local_id(),作为单个work-item内核进行编译。否则,离线编译器会将该内核作为NDRange内核编译。 请参阅OpenCL Specification version 1.06.11.1: Work-Item Functions部分了解内置work-item函数的更多信息。

对于单个work-item内核,离线编译器尝试流水线化内核中的每个循环,以允许多个循环迭代并行执行。如果编译器无法有效流水线化某些循环,或者根本无法流水线化,则内核性能可能会下降。

离线编译器不能流水线化NDRange内核中的循环。然而,这些循环可以同时接受多个work-items。一个内核可能有多个循环,每个循环都有嵌套循环。如果将每个外循环的嵌套循环的迭代总数制成表格,您会发现该制成表格中最大的总迭代值通常会减低内核吞吐量。为了有效执行NDRange内核,必然需要大量线程。