跳至內容

Parallelism#

本主題說明什麼是 Parallelism 說明在VisualApplets 設計中「連結屬性」的含義,以及該設定如何映射至生成的 FPGA 管線。本節亦闡述如何計算設計所需的並行度,以及如何透過專用運算子來調整並行度。閱讀本主題後,您將理解並行度、頻寬與 FPGA 資源使用量之間的關係、影像寬度限制如何取決於並行度,以及記憶體運算子(例如 FrameBufferRandomRead 限制並行處理。

關鍵術語

基礎設計時鐘是指幀擷取卡上所產生 FPGA 管線的時鐘,例如 312.5 MHz。它與相機的像素時鐘不同,也不是VisualApplets 編輯器內的時鐘。一個時鐘週期等於基礎設計時鐘的一個時鐘脈衝。每個時鐘週期內,可有一定數量的像素通過鏈路。該數量即為並行度。Parallelism 4 表示每個時鐘週期有四個像素。 較高的基礎設計時脈頻率或較高的並行度,會提高像素傳輸率,本主題中將此稱為頻寬。

Parallelism 以及頻寬#

Parallelism 是指每時鐘週期內,透過生成的 FPGA 管線中某個鏈路所傳輸的像素數。

Parallelism 會影響模組內的處理粒度。例如,該 LineBuffer 參數 XLength 這取決於並行處理的程度。

以下規則適用:

  • 更高的並行度 → 更高的像素速率頻寬。
  • 更高的並行度 → 更高的 FPGA 資源利用率。

位元寬度與核心大小並不包含在此像素速率數值之中。它們會增加每時脈週期的資料量,這對 DRAM 及資源配置至關重要。請參閱「核心操作」教學主題與「記憶體元件」教學主題。

設計指引

為節省 FPGA 資源,請將並行度控制在必要範圍內。

以像素速率表示的鏈路頻寬遵循以下公式:

頻寬 = 並行度 × 基本設計時脈

基本設計時鐘取決於您使用的幀擷取卡。若使用 Basler 幀擷取卡,請在「裝置資源」中查閱該數值。

關鍵術語

您可以透過「連結資訊」和「資料吞吐量」標誌,讓設計中的並行處理與資料吞吐量顯而易見。請使用工具列上的以下按鈕啟用這些標誌:

在設計中啟用鏈路資訊與吞吐量標誌

因此,您的設計中會顯示「連線資訊」和「吞吐量」標誌:

連結資訊與吞吐量標誌

在本主題中,我們將展示所有啟用「連結資訊」與「吞吐量」標誌的設計截圖。

計算所需數量Parallelism#

要為設計進行尺寸規劃,首先需計算所需的像素速率,然後根據基本設計時鐘推算出所需的並行度。

計算區域掃描設計的Parallelism 值#

對於採用面掃描相機的設計,首先需計算以每秒像素為單位的頻寬:

頻寬 = (每行像素數) × (每幀行數) × 幀率

接著利用頻寬來計算所需的並行度:

所需並行度 = 頻寬 / 基本設計時脈

請選擇最小的支援並行度,且該數值必須至少等於計算出的需求值。若向下取整,將導致設計帶寬低於要求。例如,在 312.5 MHz 的基本設計時脈下,若需達到 6000 MP/s,則需 19.2 的並行度。Parallelism 19 僅能提供 5937.5 MP/s,這是不夠的。 請使用 20,或您平台所允許的下一更高數值。

區域掃描計算範例#

對於解析度為 2064 × 2064 像素、每秒 30 幀的攝影機,適用以下頻寬計算方式:

頻寬 ≈ 2064 × 2064 × 30 ≈ 127.9 MP/s

以 312.5 MHz 為基準設計時脈,據此計算出的並行度如下:

所需並行度 ≈ 127.9 / 312.5 ≈ 0.41 → 向上取整為 1

區域頻寬

上方的螢幕截圖顯示了對應的VisualApplets 設計實作。在 相機介面 設為 4. 該數值並非來自頻寬計算的處理並行度。該 CxpCamera 操作員會根據由 ConnectionCount 模組參數(在此情況下, x1). 介面並行度與所需的處理並行度是兩個不同的數值。由於所需的處理並行度是 1, 鏈路並行度被降低至 1 在該的輸出鏈路上 LineBuffer 運算子。

在低幀率的情況下,並行度值為 1 就足夠了。在較高的幀率或解析度下,所需的並行度會增加。計算出該數值後,再將其向上捨入至下一個受支援的層級,例如: 2, 4,或 8. 若該平台需要一個 甚至 並行處理時,應先將數值向上取整,然後選取下一個較高且有效的偶數值。例如,若計算結果為 6.3, 使用 8,而不是 7.

計算線掃描設計的Parallelism 值#

對於採用線掃描相機的設計,首先需計算以像素每秒為單位的頻寬:

頻寬 = (每行像素數)× 行頻率

接著利用頻寬來計算所需的並行度:

所需並行度 = 頻寬 / 基本設計時脈

請根據您的平台規則及允許的並行處理值,將結果向上取整。

線掃描計算範例#

對於解析度為 16384 像素、行速為 120 kHz 的攝影機,其頻寬計算方式如下:

頻寬 ≈ 16384 × 120 kHz ≈ 1966.08 MP/s

以 312.5 MHz 為基準設計時脈,據此計算出的並行度如下:

所需並行度 ≈ 1966.08 / 312.5 ≈ 6.3 → 向上取整為 7

經計算後得出的結果是 6.3, 因此下一個整數是 7. 若該平台需要一個 甚至 並行性,請選擇下一個較高且有效的偶數值(8, 而非 7). 下方的螢幕截圖示範了並行處理的應用 7,當甚至不需要並行處理時,此方法依然有效。

線掃描頻寬

上方的螢幕截圖顯示了對應的VisualApplets 設計實作。相機介面上的並行處理設定為 12. 此值會由 CxpCamera 根據 CXP 連線數的運算子(ConnectionCount 參數設定為 x2). 這種介面並行性,同樣與所需的處理並行性不同。該 SplitImage 此運算子執行一維至二維的轉換。該 LineBuffer 運算子隨後將鏈結並行度降低至 7 以符合計算出的處理需求。

在設計中變更Parallelism #

以下運算子可將設計的並行度調整至符合頻寬需求:

增加或減少Parallelism#

  • PARALLELdn — 會降低並行度。請參閱 PARALLELdn 請參閱《運算子參考手冊》。
  • PARALLELup — 提高並行度。請參閱 PARALLELup 請參閱《運算子參考手冊》。
  • LineBuffer(僅限 imaFlex): 當 ParallelismConverter 參數(屬於 LineBuffer 此運算子可在不使用其他平行化運算子的情況下,調整輸入與輸出之間的平行度。請參閱 LineBuffer (imaFlex) 請參閱《運算子參考手冊》。

分割、篩選與合併資料流#

  • SplitParallel — 將一個並行度較高的資料流拆分為多個並行度較低的資料流。範例:Parallelism 8 變成兩個具有並行性的資料流 4 每個。另請參閱 SplitParallel 請參閱《運算子參考手冊》。
  • SelectFromParallel — 從並行資料流中選取個別元件,例如在每個時脈週期傳輸的多個資料字中選取其中一個。另請參閱 SelectFromParallel 請參閱《運算子參考手冊》。
  • MergeParallel — 在分別處理後,再次合併並行資料流。另請參閱 MergeParallel 請參閱《運算子參考手冊》。

其他營運商#

  • CastParallel — 重新解讀鏈路上的位元。只要符合以下條件,Parallelism 和位元寬度便可能發生變化: 位寬 × 並行度 輸入與輸出時保持不變。例如:16 位元 × PAR 2 會變成 8 位元 × PAR 4。影像寬度會隨之改變。另請參閱 CastParallel 請參閱《運算子參考手冊》。
  • ExpandToParallel — 接受並行度為 1 的輸入,並產生所需的輸出並行度。輸入值會複製到所有並行通道。另請參閱 ExpandToParallel 請參閱《運算子參考手冊》。

用例#

以下使用情境經常出現:

  • 使用 PARALLELup 為了提高並行度,將資料在並行分支中進行處理,並透過 MergeParallel. ParUpMergeParallel

  • 對於某些處理任務而言,僅選擇一個元件在數學上已足夠,不僅能提供所需的結果,還能減少資料量。使用 SelectFromParallel 從並行處理中僅轉發一個通道 4 串流。

SelectFromParallel

  • 之後 FrameBufferRandomRead, 該串流以並行方式運行 1 例如,每像素 64 位元。為了讓後續處理能以更高的並行度運行,請將資料流重新詮釋為 8 位元 × 並行度 8. 為此,請使用 CastParallel 運算子。

Parallelism FrameBufferRandom 讀取

  • 使用 ExpandToParallel 以並行方式擴展控制值或像素流 1 關於並行處理 4 當同一數值必須在所有四個並行通道中皆可取得時,例如並行分支中的係數或遮罩。

ExpandToParallel

Parallelism 限制條件#

影像的最大寬度(以像素為單位)必須能被平行度整除。

範例:

  • 採用並行處理 4, 允許的圖片寬度包括 1024 和 2048。
  • 採用並行處理 12, 圖像寬度為 16384 即為 不是 允許,因為 16384 除以 12 並非整數。

解決方法:

  1. 虛像元— 將影像擴寬(例如透過模擬連結屬性或運算子),直到影像寬度能被並行度值整除為止。
  2. 裁切— 將圖片裁切至有效的圖片寬度。

關鍵術語

所生成的 FPGA 硬體以每時鐘週期處理一個封包的方式處理像素。一條包含 16384 個像素的行無法精確地以 12 為並行度進行封裝,因為 16384 / 12 並非整數。因此,VisualApplets 要求設計中的影像寬度必須能被並行度整除。

Parallelism 搭配記憶體運算子#

FrameBufferRandomRead 僅允許 並行性 1,因為記憶體是依序存取的。若要在設計中採用更高的平行度,同時又不影響整體頻寬,請使用 CastKernel 運算子,或透過以下方式將當前像素的較高位元成分進行運算: CastParallel 運算子。

請參閱「使用核心」教學主題,了解如何操作的範例。

請參閱《運算子參考手冊》中的「FrameBufferRandomRead」,以及《運算子參考手冊》中的「FrameBufferRandomRead (imaFlex)」。

排除瓶頸問題#

當……時,通常會出現瓶頸 InsertLine 在《操作員參考手冊》中,或 InsertImage 在《操作員參考手冊》中並未與 PARALLELup. 若操作順序不當,吞吐量可能會下降。

使用插入運算子會增加輸送到處理管線中的資料量,從而提高整體頻寬。因此,在 InsertLine 或 InsertImage 運算子必須具備足夠高的性能,才能處理所產生的頻寬。

範例#

插入圖片

上圖中的範例顯示,該 InsertImage 該運算子有兩個輸入連結。每個輸入連結以 1250 MPixel/s 的頻寬,處理解析度為 5120 × 5120 像素的影像,並採用 4 級並行度。

如果在 InsertImage 運算單元,每個輸入的頻寬仍維持在 1250 MPixel/s。然而,由於有兩條輸入鏈路,該設計必須處理總計 2 × 1250 MPixel/s 的吞吐量。

為避免此頻寬瓶頸,請透過以下方式提高並行度: PARALLELup 在「」之前的運算子 InsertImage 如下所示的運算子:

插入圖片(Par UP)