2012-11-26 34 views
2

Hello大家好, 舉一個例子考慮兩個openCL內核一個內核讓我們說add和other是sub。重新利用openCL內存

加載內核是

__kernel void add(global int *output1,global int *input1,global int *input2 
    /* Put other parameters here */ 
    ) 
     { 
    int i = get_global_id(0); 
    output1[i] = input1[i] + input2[i]; 
     } 

子內核是

__kernel void add(global int *output2,global int *input1,global int *input2 
    /* Put other parameters here */ 
    ) 
     { 
    int i = get_global_id(0); 
    output2[i] = input1[i] - input2[i]; 
     } 

這兩個內核,其2個輸入是相同的,我需要複製相同的輸入(輸入1 &輸入2)兩次到裝置從主機內存,這可能會增加性能方面的成本。
有什麼辦法讓我可以複製一次數據,並在任何函數中重新使用它,直到我不釋放內存?

+1

爲什麼你需要複製相同的輸入兩次?你可以在設備內存中創建緩衝區,並且可以通過使用clSetKernelArg()重新定義內核參數來重用它們(當然,除非你想同時使用它們*這更加棘手,而且我不確定它是事實上甚至被OpenCL標準所允許)。 – Thomas

回答

4

這是一個答案,因爲它似乎完全回答了這個問題。

您通常在設備內存中創建緩衝區,您可以通過使用clSetKernelArg()重新定義內核參數來重用這些緩衝區(當然,除非您想在同一時間使用這些更棘手的問題,事實上,我們不確定它甚至被OpenCL標準所允許)。

+0

是的,只需使用1內存緩衝區。將兩個內核設置爲使用它作爲輸入「clSetKernelArgs()」。我做了很多次,完全沒有問題。 – DarkZeros

0

您應該使用GL_interopeting功能。你使用它來進行opencl和opengl之間的通信。終止後,你的openCL不會刪除一個openGL頂點緩衝區對象(VBO),對嗎?但是這種內核很難編寫,可能也需要jogl文件!

cl_mem clCreateFromGLBuffer(cl_context context, cl_mem_flags flags, 
         GLuint vbo_desc, cl_int *err) 

創建gl-cl共享對象。

glFinish(); 
clEnqueueAcquireGLObjects(queue, 1, &buff, 0, NULL, NULL); 

clEnqueueNDRangeKernel(queue, proc, 1, NULL, global_size, local_size, 0, NULL, NULL); 

clEnqueueReleaseGLObjects(queue, 1, &buff, 0, NULL, NULL); 
clFinish(); 

是此執行的示例。取自:http://www.dyn-lab.com/articles/cl-gl.html

因此,您不必每次都將緩衝區複製到主機。

+0

我希望它在opencl沒有openGL的幫助...感謝您的評論我解決了托馬斯的評論幫助... – Meluha