Parallelism#
關鍵詞
Base Design Clock 是影音擷取卡上產生的 FPGA 管線時脈,例如 312.5 MHz。它與相機像素時脈不同,也不是 VisualApplets 編輯器內部的時脈。時脈週期 (clock cycle) 是 Base Design Clock 的一個脈衝。每個時脈週期可以通過連線傳輸一定數量的像素。該數量即為 parallelism。Parallelism 4 表示每個時脈週期四個像素。較高的 Base Design Clock 頻率或較高的 parallelism 會增加 像素速率,本主題將其稱為 頻寬。
Parallelism 與頻寬#
Parallelism 是在產生的 FPGA 管線連線中,每個時脈週期流動的像素數量。
Parallelism 會影響模組內部的處理粒度。例如, LineBuffer Property XLength 取決於 parallelism。
適用以下規則:
- 較高的 parallelism → 較高的像素速率頻寬。
- 較高的 parallelism → 較高的 FPGA 資源使用率。
位元寬度和核心大小不屬於此像素速率數值。它們會增加每個時脈的資料量,這對 DRAM 和資源很重要。請參閱 Working with Kernels 教學主題與 Memory Elements 教學主題。
設計準則
為節省 FPGA 資源,Parallelism 請保持在剛好夠用的水準,不要過高。
作為像素速率的連線頻寬遵循以下公式:
Bandwidth = parallelism × Base Design Clock
Base Design Clock 取決於您所使用的影音擷取卡。對於 Basler 影音擷取卡,請在 Device Resources 中查詢該數值。
關鍵詞
您可以使用 Link Info 和 Throughput 旗標,在設計中顯示 parallelism 和資料產出量。使用工具列中的下列按鈕來啟用這些旗標:

因此,Link Info 與 Throughput 旗標將會顯示在您的設計中:

在本主題中,我們展示了啟用 Link Info 和 Throughput 標記的所有設計截圖。
計算所需的 Parallelism#
若要決定設計的規模,請先計算所需的像素速率,然後從 Base Design Clock 推導所需的 parallelism。
計算面陣掃描設計的 Parallelism#
對於搭配面陣相機的設計,請先以每秒像素數計算頻寬:
Bandwidth = (pixels per line) × (lines per frame) × frame rate
然後使用頻寬來計算所需的 parallelism:
Required parallelism = bandwidth / 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 設計實作。於 相機介面 且 4。該值並非頻寬計算所得的處理 Parallelism。該 CxpCamera operator 會根據由 ConnectionCount 模組參數(在此情況下為 x1)。介面 Parallelism 與所需的處理 Parallelism 是不同的數值。由於所需的處理 Parallelism 為 1,因此連結 Parallelism 會在 1 的輸出連結處降低至 LineBuffer operator。
在低影格率下,Parallelism 值為 1 即已足夠。在較高的影格率或解析度下,所需的 Parallelism 會增加。請計算該值,然後将其進位至下一個支援的層級,例如: 2, 4或 8)所定義的 CXP 連接數,自動設定介面 Parallelism。 偶數 Parallelism,請先向上進位,然後選擇下一個較高的有效偶數值。例如,如果計算結果為 6.3,則應使用 8,而不是 7.
計算線陣掃描設計的 Parallelism#
對於使用線掃描相機的設計,請先計算每秒像素的頻寬:
頻寬 = (每行像素) × 行頻 (line rate)
然後使用頻寬來計算所需的 parallelism:
Required parallelism = bandwidth / 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)所定義的 CXP 連接數,自動設定介面 Parallelism。 偶數 Parallelism,請選擇下一個較高的有效偶數值(8,而不是 7)。上圖使用的 Parallelism 為 7,這在不需要偶數 Parallelism 時有效。

上圖顯示了相應的 VisualApplets 設計實作。相機介面處的 Parallelism 設定為 12。此值由 CxpCamera operator 會根據 CXP 連接數(ConnectionCount 參數設定為 x2)自動設定。該介面 Parallelism 同樣不等於所需的處理 Parallelism。此 SplitImage 運算子執行 1D 到 2D 轉換。 LineBuffer 隨後,運算子會將連結 Parallelism 降低至 7 ,以符合計算出的處理需求。
變更設計中的 Parallelism#
以下的 operators 會將設計的 Parallelism 調整為符合 頻寬要求:
增加或減少 Parallelism#
PARALLELdn— 降低 Parallelism。請參閱 PARALLELdn Operator Reference 中的。PARALLELup— 提高 Parallelism。請參閱 PARALLELup Operator Reference 中的。- LineBuffer (僅限 imaFlex): 影像
ParallelismConverter運算子的LineBufferoperator 無需額外的 Parallelism operators 即可調整輸入與輸出之間的 Parallelism。請參閱 LineBuffer (imaFlex) Operator Reference 中的。
分割、選取與合併串流#
SplitParallel— 將具有較高 Parallelism 的單一資料串流分割為多個具有較低 Parallelism 的串流。範例:Parallelism8變成兩個 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.
-
對於某些處理任務,僅選取一個元件在數學上就已足夠,既能提供所需的結果又能減少資料量。使用
SelectFromParallel僅轉發來自 Parallelism4串流的一個通道。

- 在之後
FrameBufferRandomRead,資料流會以 Parallelism 運行1,例如每個像素 64 bit。為了讓後端處理能夠以更高的 Parallelism 運行,請將資料流重新解釋為 8 bit × Parallelism8。為此,請使用CastParalleloperator。

- 使用
ExpandToParallel以擴展具有 Parallelism 的控制值或像素資料流1轉換為 Parallelism4當相同的值必須在所有四個平行通道中可用時,例如用於平行分支中的係數或遮罩。

Parallelism 限制#
以像素為單位的 maximum image width 必須能夠被 Parallelism 整除。
範例:
- 在 Parallelism 為
4的情況下,允許的影像寬度包括 1024 和 2048。 - 在 Parallelism 為
12,影像寬度 16384 是 不會 允許的,因為 16384 / 12 不是整數。
因應方法:
- Dummy pixels — 擴寬影像(例如透過模擬鏈結屬性或運算子),直到影像寬度能被 Parallelism 值整除。
- Crop — 將影像裁切至有效的影像寬度。
關鍵詞
產生的 FPGA 硬體會以每個時脈封包的形式處理像素。16384 像素的行無法完美封裝到 Parallelism 12 中,因為 16384 / 12 不是整數。因此,VisualApplets 要求設計中的影像寬度必須能被 Parallelism 整除。
具備記憶體運算子的 Parallelism#
FrameBufferRandomRead 僅允許 Parallelism 1,因為記憶體是以循序方式存取。若要在設計中使用較高的 Parallelism 且不影響整體頻寬,請使用以下工具將平行元件轉換為核心元件: CastKernel 運算子,或使用以下工具將目前像素轉換為更高位元的元件: CastParallel operator。
如需如何執行此操作的範例,請參閱 Working with Kernels 教學主題。
請參閱運算子參考手冊中的 FrameBufferRandomRead 以及運算子參考手冊中的 FrameBufferRandomRead (imaFlex)。
疑難排解瓶頸#
典型的瓶頸發生於 InsertLine 於運算子參考手冊中,或 InsertImage 於運算子參考手冊中未與 PARALLELup。如果運算子順序不佳,吞吐量可能會下降。
使用插入運算子會增加饋入處理管線的資料量,進而提高整體頻寬。因此, InsertLine 或 InsertImage 運算子之後的 Parallelism
範例#

必須夠高,才能處理產生的頻寬。上圖中的範例顯示 InsertImage 運算子具有兩個輸入連結。每個輸入連結皆以 4 的 Parallelism 處理解析度為 5120 × 5120 像素、頻寬為 1250 MPixel/s 的影像。
如果在以下項目之前未增加 Parallelism: InsertImage 運算子,每個輸入的頻寬維持 1250 MPixel/s。然而,由於有兩個輸入連線,因此設計必須處理 2 × 1250 MPixel/s 的合併吞吐量。
為了避免這個頻寬瓶頸,請使用 PARALLELup 運算子增加 Parallelism,位置在 InsertImage 運算子之前,如下所示:

相關主題#
- Pipeline Concept 教學主題 — 產量、瓶頸與鏈結容量
- 參數化 教學主題 —
Parallelismlink property - Memory 元素 教學主題 — RAM 資料寬度與
LineBufferParallelism 轉換 - Working with Kernels 教學主題 — 核心大小與 Parallelism 的比較
- Latency 教學主題 — Parallelism 與延遲
- 使用者手冊中的 Bandwidth of an Applet — 正式頻寬定義
- 裝置資源— 基本設計時脈頻率
- 使用者手冊中的 Bandwidth Bottlenecks — 運算子排序與瓶頸