我在這裏看到了堆棧溢出處理相同問題的幾個問題,但沒有明確的答案。我想我會再問一次,並附帶一些我自己的問題。都涉及到手頭的主題。何時發生OpenCL數據傳輸?
那麼,我們知道從主機到openCL設備的數據傳輸何時發生嗎?你能告訴我下面的函數(即,哪些數據被傳輸或創建的,如果有的話,當這些函數被調用?)確切的內存傳輸操作:
clCreateBuffer()
clSetKernelArg()
clEnqueueNDRangeKernel()
前兩個甚至不會產生事件,所以我們無法計時,但肯定會發生一些數據傳輸。
有沒有辦法將數據傳輸到設備,而無需先將其設置爲內核arg?
從我自己的初步測試中可以看出,使用CL_MEM_USE_HOST_PTR
創建的mem對象直接被設備操作。爲什麼這樣做不可取,因爲這樣我們就可以避免進一步的數據傳輸命令(並且驅動程序肯定會以最有效的方式實現)?
在內核返回後,傳輸的數據(比如,作爲內核arg的參數)是否留在設備上以供進一步操作?如果沒有,有辦法做到這一點?