2012-04-10 26 views
9

的OpenCL標準定義了以下選項,以獲取有關設備信息和編譯的內核:什麼是算法來確定最佳的工作組大小和工作組的數量

  • CL_DEVICE_MAX_COMPUTE_UNITS

  • CL_DEVICE_MAX_WORK_GROUP_SIZE

  • CL_KERNEL_WORK_GROUP_SIZE

  • CL_KERNEL_PREFERRED_W ORK_GROUP_SIZE_MULTIPLE

鑑於這種價值觀,我怎麼能計算工作組和工作組的數量的最佳規模?

回答

7

您可以通過實驗爲您的算法找到這些值。使用分析器獲取硬編碼。

我喜歡使用CL_DEVICE_MAX_COMPUTE_UNITS作爲工作組的數量,因爲我經常依靠同步工作項目。我通常運行幾乎沒有分支的內核,所以在每個計算單元中執行相同的時間。

CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE的一些倍數對於您的設備來說是最優的。實際上多少取決於您的內存訪問模式以及您在每個工作項目上所做的工作類型。在運行繁重的計算限制(ALU)內核時,使用1作爲倍數。如果內存訪問受到瓶頸,請嘗試使用更大的倍數來隱藏內存延遲。使用分析器來確定您的訪問時間和ALU時間是否最優。

對於任何設備,ALU提取的最佳比例爲1:1。這在實踐中很少實現,因此您希望ALU/SIMD庫保持飽和狀態。這意味着ALU:只要有可能,獲取應該大於1。少於1意味着您應該嘗試更大的工作組大小以更好地隱藏內存延遲。

+0

我打算支持一系列設備。這是否意味着,我必須在每個內核上測試我的內核以獲得內核入隊的最佳值? – Kentzo 2012-04-11 05:08:04

+0

在您有權訪問的設備上測試您的算法 - 結果不會太多變化。我建議在您想要定位的每個主要架構的一臺設備上嘗試。如果可以,請在運行時調整參數以嘗試優化。這可以調整您在開發過程中發現的最佳值。從最終用戶/客戶端獲得關於實際硬件編號的反饋意見後,您可以將改進重點放在最常見的設備上。 – mfa 2012-04-11 11:07:53

+0

通常使用'CL_DEVICE_MAX_COMPUTE_UNITS'不會給你最優的性能(除非你可以在工作組之間進行很多同步,但這通常是一個壞主意)。我通常會問這些文檔是否有很好的價值,但我從來沒有見過更多的工作組會傷害到性能,所以更多的是困惑。請注意,如果您沒有使用足夠的工作組(如CL_DEVICE_MAX_COMPUTE_UNITS,因爲CU一次可以支持多於一個工作組),那麼關於選擇較高工作組大小來隱藏內存延遲的部分是(至少對於gpus)。 – Grizzly 2012-04-12 13:43:32

相關問題