跳转到内容

Parallelism#

本主题介绍 Parallelism link 属性在 VisualApplets 设计中的含义,以及该设置如何映射到生成的 FPGA 流水线。它还解释了如何计算设计所需的 parallelism,以及如何使用专用算子调整 parallelism。读完本主题后,您将了解 parallelism、带宽与 FPGA 资源使用量之间的关系、图像宽度约束如何取决于 parallelism,以及诸如 FrameBufferRandomRead 限制 Parallelism。

关键术语

Base Design Clock 是采集卡上生成的 FPGA 流水线时钟,例如 312.5 MHz。它与相机像素时钟不同,也不是 VisualApplets 编辑器内部的时钟。时钟周期是 Base Design Clock 的一个脉冲。在每个时钟周期内,可以通过链路传输一定数量的像素。该数量即为 parallelism。Parallelism 4 意味着每个时钟周期传输四个像素。较高的 Base Design Clock 频率或更高的 parallelism 会提高像素速率,本主题将其称为带宽。

Parallelism 与带宽#

Parallelism 是指在生成的 FPGA 流水线的链路中,每个时钟周期流过的像素数量。

Parallelism 会影响模块内部的处理粒度。例如, LineBuffer 参数 XLength 取决于 Parallelism。

适用以下规则:

  • 更高的 Parallelism → 更高的像素速率带宽。
  • 更高的 Parallelism → 更高的 FPGA 资源占用。

位宽和核大小不包含在此像素速率数值中。它们会增加每个时钟周期的数据量,这对于 DRAM 和资源非常重要。请参阅处理核教程主题和内存元素教程主题。

设计指南

将 Parallelism 保持在不高于必要的水平,以节省 FPGA 资源。

作为像素速率的链路带宽遵循以下公式:

带宽 = Parallelism × Base Design Clock

Base Design Clock 取决于您使用的采集卡。对于 Basler 采集卡,请在设备资源中查找该值。

关键术语

您可以使用“链路信息”和“吞吐量”标志,在设计中显示并行性和数据吞吐量。使用工具栏中的以下按钮激活这些标志:

在设计中激活链路信息和吞吐量标志

因此,您的设计中会显示 Link Info 和 Throughput 标志:

Link Info 和 Throughput 标志

在本主题中,我们展示的所有设计截图均启用了 Link Info 和 Throughput 标志。

计算所需的 Parallelism#

要确定设计的尺寸,首先计算所需的像素速率,然后从 Base Design Clock 推导出所需的 Parallelism。

计算面阵扫描设计的 Parallelism#

对于使用面阵相机的设计,首先以每秒像素数计算带宽:

带宽 = (每行像素数)×(每帧行数)× 帧率

然后使用带宽计算所需的 Parallelism:

所需的 Parallelism = 带宽 / Base Design Clock

选择至少与计算要求一样大的受支持的最小 Parallelism。向下取整会使设计低于所需的带宽。例如,在 Base Design Clock 为 312.5 MHz 时,6000 MP/s 需要 19.2 的 Parallelism。Parallelism 19 只能提供 5937.5 MP/s,这是不够的。请使用 20,或您的平台允许的下一个更高值。

面阵扫描计算示例#

对于分辨率为 2064 × 2064 像素且帧率为每秒 30 帧的相机,适用以下带宽计算:

带宽 ≈ 2064 × 2064 × 30 ≈ 127.9 MP/s

在 Base Design Clock 为 312.5 MHz 的情况下,这会导致以下计算出的 Parallelism:

所需的 Parallelism ≈ 127.9 / 312.5 ≈ 0.41 → 向上取整为 1

面阵带宽

上面的截图显示了相应的 VisualApplets 设计实现。处的 parallelism 相机接口 设为 4。该值并非带宽计算所得的处理 Parallelism 。 CxpCamera 运算符会根据以下定义的 CXP 连接数量自动设置接口 Parallelism: ConnectionCount 模块参数(在这种情况下, x1)自动设置接口 Parallelism 。接口 Parallelism 与所需的处理 Parallelism 是不同的数值。由于所需的处理 Parallelism 为 1,因此链路 Parallelism 在 1 的输出链路上降低至 LineBuffer 算子。

在低帧率下, Parallelism 值为 1 即可满足要求。在较高帧率或分辨率下,所需的 Parallelism 会增加。请计算该值,然后将其向上取整至下一个支持的级别,例如: 2, 4或 8)。如果平台需要 偶数 Parallelism,请先向上取整,然后选择下一个更高的有效偶数值。例如,如果计算结果为 6.3,请使用 8,而不是 7.

计算线阵扫描设计的 Parallelism#

对于采用线扫描相机的设计,请首先计算每秒像素数的带宽:

带宽 =(每行像素数)× 行频

然后使用带宽计算所需的 Parallelism:

所需的 Parallelism = 带宽 / Base Design Clock

根据您的平台规则和允许的 Parallelism 值,将结果向上取整。

线阵扫描计算示例#

对于分辨率为 16384 像素且行频为 120 kHz 的相机,适用以下带宽计算:

带宽 ≈ 16384 × 120 kHz ≈ 1966.08 MP/s

在 Base Design Clock 为 312.5 MHz 的情况下,这会导致以下计算出的 Parallelism:

所需的 Parallelism ≈ 1966.08 / 312.5 ≈ 6.3 → 向上取整为 7

计算结果为 6.3,因此下一个整数是 7)。如果平台需要 偶数 Parallelism,请选择下一个更高的有效偶数值(8,而不是 7)。下方的截图使用了 Parallelism 7,这在不需要偶数 Parallelism 时是有效的。

行扫描带宽

上方截图展示了相应的 VisualApplets 设计实现。相机接口处的 Parallelism 设置为 12。该值由 CxpCamera 运算符根据 CXP 连接数量(ConnectionCount 参数设置为 x2)。此接口 Parallelism 同样与所需的处理 Parallelism 不同。 SplitImage 运算符执行 1D 到 2D 转换。随后, LineBuffer 运算符将链路 Parallelism 降低至 7 ,以匹配计算出的处理需求。

更改设计中的 Parallelism#

以下运算符将设计的 Parallelism 调整为符合 带宽要求:

增加或减少 Parallelism#

  • PARALLELdn — 减小 Parallelism。参见 PARALLELdn 中的 Operator Reference。
  • PARALLELup — 增大 Parallelism。参见 PARALLELup 中的 Operator Reference。
  • LineBuffer(仅限 imaFlex): 即: ParallelismConverter 算子的 LineBuffer 运算符可在输入和输出之间调整 Parallelism,而无需附加的 Parallelism 运算符。参见 LineBuffer (imaFlex) 中的 Operator Reference。

拆分、选择和合并流#

  • SplitParallel — 将一个具有较高 Parallelism 的数据流拆分为多个具有较低 Parallelism 的数据流。示例:Parallelism 8 变为两个数据流,每个数据流的 Parallelism 为 4 每个。另请参阅 SplitParallel 中的 Operator Reference。
  • SelectFromParallel — 从并行流中选择单个组件,例如每个时钟周期传输的多个数据字中的一个。另请参阅 SelectFromParallel 中的 Operator Reference。
  • MergeParallel — 分别处理后再次合并并行流。另请参阅 MergeParallel 中的 Operator Reference。

其他算子#

  • CastParallel — 重新解释链路上的位。只要 Bit Width × Parallelism 输入和输出保持相等,Parallelism 和 Bit Width 可能会改变。例如:16 bit × PAR 2 变为 8 bit × PAR 4。图像宽度会相应更改。另请参阅 CastParallel 中的 Operator Reference。
  • ExpandToParallel — 接收 Parallelism 为 1 的输入并生成所需的输出 Parallelism。输入值将复制到所有并行通道。另请参阅 ExpandToParallel 中的 Operator Reference。

用例#

以下是用例中经常出现的场景:

  • 使用 PARALLELup 以提高 Parallelism,在并行分支中处理数据,并使用 MergeParallel. ParUpMergeParallel

  • 再次合并分支。对于某些处理任务,在数学上只需选择一个组件即可获得所需的结果,同时减少数据量。使用 SelectFromParallel 仅转发来自 Parallelism 4 流的一个通道。

SelectFromParallel

  • 在 FrameBufferRandomRead之后 1 ,数据流以 Parallelism 运行,例如每像素 64 bit。为了使下游处理以更高的 Parallelism 运行,可将数据流重新解释为 8 bit × Parallelism 8为此,请使用 CastParallel 算子。

Parallelism FrameBufferRandom read

  • 使用 ExpandToParallel 以使用 Parallelism 扩展控制值或像素流 1 至 Parallelism 4 当必须在所有四个并行通道中都可用相同的值时(例如并行分支中的系数或掩码)。

ExpandToParallel

Parallelism 限制#

以像素为单位的 最大图像宽度 必须 能被 Parallelism 整除。

示例:

  • 在 Parallelism 为 4时,允许的图像宽度包括 1024 和 2048。
  • 在 Parallelism 为 12,图像宽度为 16384 是 不 允许的,因为 16384 / 12 不是整数。

变通方法:

  1. Dummy pixels — 增宽图像(例如通过仿真链接 Property 或算子),直到图像宽度能被 Parallelism 值整除。
  2. Crop — 将图像裁剪为有效的图像宽度。

关键术语

生成的 FPGA 硬件按每个时钟的数据包处理像素。16384 像素的行无法完全塞入 Parallelism 12 中,因为 16384 / 12 不是整数。因此,VisualApplets 要求设计中的图像宽度必须能被 Parallelism 整除。

带内存算子的 Parallelism#

FrameBufferRandomRead 仅允许 Parallelism 1,因为内存是按顺序访问的。要在设计中使用更高的 Parallelism 且不影响整体带宽,请使用以下工具将并行组件转换为内核组件: CastKernel 算子将并行分量转换为内核分量,或使用 CastParallel 算子。

有关如何执行此操作的示例,请参见 Working with Kernels 教程主题。

请参阅算子参考中的 FrameBufferRandomRead 以及算子参考中的 FrameBufferRandomRead (imaFlex)。

故障排除与瓶颈分析#

典型瓶颈出现在 InsertLine 算子参考中的 InsertImage 或算子参考中的 PARALLELup结合使用时,通常会出现瓶颈。

使用插入算子会增加输入到处理流水线的数据量,从而提高整体带宽。因此, InsertLine 或 InsertImage 算子之后的 Parallelism 必须足够高,以处理由此产生的带宽。

示例#

Insert Image

上图中的示例表明, InsertImage 算子有两个输入链路。每个输入链路以 1250 MPixel/s 的带宽处理分辨率为 5120 × 5120 像素的图像,使用的 Parallelism 为 4。

如果在 InsertImage 算子之前未增加 Parallelism,则每个输入的带宽仍保持 1250 MPixel/s。但是,由于有两个输入链路,设计必须处理 2 × 1250 MPixel/s 的综合吞吐量。

为避免此带宽瓶颈,请使用以下工具增加 Parallelism: PARALLELup 运算符之前 InsertImage 运算符,如下图所示:

Insert Image Par UP