2011-10-01 60 views
14

我曾在幾個項目上與OpenCL合作過,但一直將內核編寫爲一個(有時很大)的函數。現在我正在研究一個更復雜的項目,並希望在多個內核之間共享函數。如何構建大型OpenCL內核?

但我能找到的所有例子都顯示內核爲單個文件(很少有甚至調用輔助函數)。似乎應該可以使用多個文件 - clCreateProgramWithSource()接受多個字符串(並且將它們結合起來,我假設) - 雖然pyopencl的Program()只接受單一來源。

所以我想從別人聽到有經驗的這樣:

  • 是否有與多個源文件相關的問題?
  • 是pyopencl簡單連接文件的最佳解決方法?
  • 有什麼辦法可以編譯一個函數庫(而不是每個內核都傳入庫源代碼,即使並非全部都使用)?
  • 如果每次都需要傳入庫源,是否丟棄了未使用的函數(無開銷)?
  • 任何其他最佳做法/建議?

謝謝。

+2

您可以創建一個包含#include「part1.cl」#include「part2.cl」的並置文件。這適用於我(NVidia編譯器),儘管可能每次應用程序運行時編譯所有內容。 我認爲有一個預編譯函數庫有點科幻,因爲函數代碼被內聯到每個內核中(這就是爲什麼你不能寫遞歸函數)。 –

回答

6

我不認爲OpenCL在程序中有多個源文件的概念 - 一個程序是一個編譯單元。但是,您可以在編譯時使用#include並插入標頭或其他.cl文件。

您可以在OpenCL程序中擁有多個內核 - 因此,在編譯完成後,您可以調用任何已編譯的內核集合。

任何未使用的代碼 - 函數或任何靜態已知無法訪問的內容 - 可以假定在編譯過程中被消除,編譯時間花費很小。

+0

謝謝。這是我正在做的。但令人沮喪的是,pyopencl在緩存內核時沒有考慮到#include的內容。所以更改「庫」文件不會影響已編譯的內核,而無需手動刪除緩存。無論如何,我會等到看到有人有更好的主意,然後再將您標爲最好(也是唯一的!)。乾杯。 –

+0

如果這是真的,那麼clCreateProgramWithSource的語法就很尷尬,不是嗎?它明確需要多個字符串和每個字符串的長度。我不確定它實際上是否有效(我在這裏試圖讓它工作),但它聽起來很奇怪,因爲它的語法不能工作... – user1111929

5

在OpenCL 1.2中,您將不同的目標文件鏈接在一起。

+0

謝謝;將嘗試這一點,當我回到頂級opencl工作。 –