2012-02-09 80 views
2

我正在捕捉視頻幀。每幀都作爲Image2D傳遞到內核中。我有大約五種簡單的圖像處理算法(模糊,銳化等)供用戶選擇(也可以是不同的組合)。我在這裏看到三種可能性:如何在內核中處理可變數量的算法?

  1. 一個內核:在運行時構建內核與 選擇算法的字符串和編譯(和採取的一次性 編譯延遲開銷)
  2. 一個內核:使用標誌處理選定的算法(雖然我明白,條件分支是不可取的)
  3. 許多內核(每個算法一個):似乎是問題,即Image2D可以是read_onlywrite_only,我需要重複地複製圖像作爲內核的一個輸出圖像是GPU輸入下一個內核的映像。

是否有建議的經驗法則遵循哪種方式?

+0

關於條件執行:您所談論的分支類型可能並不是那麼糟糕。每個工作項目對於給定的內核執行仍然沿着相同的路徑。這是不同的工作項目向不同方向分支的情況,這些情況會真正殺死你的表現。 – James 2012-02-10 02:20:26

+0

謝謝詹姆斯,我會評估它。 – rdoubleui 2012-02-10 10:10:10

回答

2

只讀/只寫問題的一個解決方法可能是在中間步驟使用緩衝區。

Image2D - > buffer0 - >緩衝器1 - > ... bufferN - > Image2D

或者使用兩個緩衝區,並相間他們,如果你不需要中間結果。 (I2d,B0,B1,B0,...,I2D)

您可能需要事先知道您正在應用多少個過濾器,但這應該不是什麼大問題。

+0

有趣的想法。那麼,在這種情況下,一個緩衝區就足夠了,因爲算法是按順序應用的。 – rdoubleui 2012-02-09 16:12:30

+0

當然,我錯了單緩衝區。內部至少需要兩個緩衝區。 – rdoubleui 2012-02-13 13:26:26

+1

我採用這種方法,發現它更優雅。在一個內核中仍然有提到的分支,但是,分支對於所有工作項目都是相同的路徑。我計時了,它沒有什麼區別。 – rdoubleui 2012-02-16 09:52:01

1

我建議你儘量避免前兩個選項

  1. 這樣你將有一個非常不可讀和複雜的內核代碼。如果你100%確定代碼完成了它應該做的事情,那麼這是可以的。這是考慮到你的工作項目的安排和分組。問題在於,這樣做會很困難並且調試和維護你的內核。

  2. 這個,我認爲,如果你的線程可能在不同的路徑下,這比第一個選項更差。簡單的分支可以降低你的表現並且爲同步創造麻煩。除了簡單分支之外,您應該考慮一個事實,即您的算法可能需要不同的線程數量和排列。如果是這種情況,那麼對所有操作使用一個內核是一個非常糟糕的主意。

我沒有嘗試過自己,但我認爲你應該嘗試@mfa建議的選項。

+0

看看詹姆斯的評論:他認爲第二種方式可能並不那麼糟糕,因爲所有的工作項目都沿着同樣的道路前進。內核在幀之間是不同的,新幀在每幀之前被排隊等待執行。我會報告,我的嘗試最終導致了什麼。 – rdoubleui 2012-02-12 19:42:33

相關問題