2012-11-26 4 views
2

안녕하십니까. 예를 들어 은 두 개의 openCL 커널 중 하나의 커널을 추가하고 다른 하나는 sub라고 가정합시다.openCL 메모리 재사용

추가 커널 서브 커널 장치에 두번 2 개 입력 동일 제가 동일한 입력을 복사 할 필요가 두 커널 (& 입력 2 입력 1) 미국

__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]; 
     } 

이다

__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]; 
     } 

인 호스트 메모리에서 가져 오면 성능면에서 약간의 비용이 추가 될 수 있습니다.
메모리를 해제하지 않을 때까지 데이터를 한 번 복사 한 다음 다시 사용할 수있는 방법이 있습니까?

+1

왜 동일한 입력을 두 번 복사해야합니까? 장치 메모리에 버퍼를 만들고 clSetKernelArg()를 통해 커널 인수를 다시 정의하여 재사용 할 수 있습니다 (물론 * 동시에 * 사용하는 것이 더 까다 롭습니다. 사실 OpenCL 표준에 의해서도 허용됨). – Thomas

답변

4

질문에 완전히 대답 한 것 같으므로이 답변을 작성하십시오.

일반적으로 장치 메모리에 버퍼를 만들고 clSetKernelArg()를 통해 커널 인수를 재정 의하여 이러한 버퍼를 다시 사용할 수 있습니다 (물론 더 까다 롭고 동시에 사용하지 않는 한, 사실 OpenCL 표준에 의해서도 허용되지는 않습니다.)

+0

예, 단지 1 개의 메모리 버퍼 만 사용하십시오. 두 커널을 모두 "clSetKernelArgs()"입력으로 사용하도록 설정하십시오. 나는 많은 시간을 보냈다. 전혀 문제가되지 않았다. – DarkZeros

0

GL_interopeting 기능을 사용해야합니다. opencl과 opengl 사이의 통신에 이것을 사용합니다. 종료 후 openCL 버텍스 버퍼 객체 (VBO)를 openCL이 삭제하지 않겠습니까? 그러나 이런 종류의 커널은 쓰기가 더 어렵고 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

OpenGL의 도움없이 opencl에서 원한다면 ... 토마스가 작성한 의견의 도움으로 의견을 보내 주셔서 감사합니다. – Meluha

관련 문제