我試圖將用C編寫的較小程序翻譯成openCL。我應該將一些輸入數據傳輸到GPU,然後使用連續的內核調用在設備上執行所有計算。將C代碼翻譯成OpenCL
但是,由於我使用的數據量很大,因此我必須避免在CPU和GPU之間來回傳輸數據,所以我在部分代碼中不適合並行化。
有沒有辦法執行一些內核沒有並行處理,所以我可以用它們代替這些代碼部分?這是通過將全局工作量設置爲1來實現的嗎?
我試圖將用C編寫的較小程序翻譯成openCL。我應該將一些輸入數據傳輸到GPU,然後使用連續的內核調用在設備上執行所有計算。將C代碼翻譯成OpenCL
但是,由於我使用的數據量很大,因此我必須避免在CPU和GPU之間來回傳輸數據,所以我在部分代碼中不適合並行化。
有沒有辦法執行一些內核沒有並行處理,所以我可以用它們代替這些代碼部分?這是通過將全局工作量設置爲1來實現的嗎?
是的,您可以在OpenCL設備上串行執行代碼。要做到這一點,請像在C中一樣編寫內核代碼,然後使用clEnqueueTask()函數執行它。
你可以管理兩個設備:
這是一個有點複雜,因爲你必須通過設備管理一個命令隊列以調度每個內核設備。
如果設備是相同的平臺(通常AMD),你可以使用相同的背景的一部分,否則,你將不得不以創建一個CPU更多的上下文。
而且,如果你想有一個更細粒度的CPU 任務並行處理,如果你的CPU支持的話你可以使用裝置裂變。
感謝您的回答。我是openCL的新手,所以如果這是一個愚蠢的問題,請原諒我,但如果我有兩個上下文(Intel CPU和nVidia GPU)並不意味着我仍然需要來回發送數據? – user1894442
你可以在內存映射中使用固定內存:CPU可以直接訪問內存,GPU可以將必要的部分複製到其全局內存中。如果與處理相比您有大量數據移動,則可能需要修改算法。在理想情況下,您可以同時運行CPU和GPU。 – Pragmateek