본문 바로가기
Program Language/OpenCL

clFinish, clFlush, block

by Leo 리오 2012. 5. 26.
반응형


cl_int clFinish (cl_command_queue command_queue)


Blocks until all previously queued OpenCL commands in a command-queue are issued to the associated device and have completed.


Notes

Blocks until all previously queued OpenCL commands in command_queue are issued to the associated device and have completed.

clFinish does not return until all queued commands in command_queue have been processed and completed. clFinish is also a synchronization point.


커맨드큐의 커맨드들이 다 실행되기 전까지 리턴하지 않는다. (블러킹)

동기화포인트로 사용.



cl_int clFlush (cl_command_queue command_queue)


Issues all previously queued OpenCL commands in a command-queue to the device associated with the command-queue.


Notes

Issues all previously queued OpenCL commands in command_queue to the device associated with command_queue.

clFlush only guarantees that all queued commands to command_queue get issued to the appropriate device. There is no guarantee that they will be complete after clFlush returns.



커맨드큐의 커맨드들을 이슈 시킨다.




아마,



Finish는 write, execute, read같은 명령어를 다 실행시킬때 까지 기다리는거고,


Flush는 커맨드큐의 커맨드들을 디바이스에 넣을때 까지 기다림.



예를 들면,


enqueueWrite()에서


Finish는 모든 데이터를 다 쓸 때 까지 기다리는 거고,


Flush는 쓰라는 명령어를 디바이스에 전달할 때 까지 기다리는듯.



여기에 따르면,

https://www.khronos.org/message_boards/viewtopic.php?f=28&t=4335



clEnqueueReadBuffer()같은 함수들은 알아서 블러킹을 하기 때문에 Finish나 Flush를 쓸 필요가 없다.(blocking CL_TRUE를 쓸때)


아래글을 보면 정확히는 

블러킹함수는 clflush를 대체하는듯.


Any blocking commands queued in a command-queue such as clEnqueueRead{Image|Buffer}

with blocking_read set to CL_TRUE, clEnqueueWrite{Image|Buffer} with blocking_write set 

to CL_TRUE, clEnqueueMap{Buffer|Image} with blocking_map set to CL_TRUE or 

clWaitForEvents perform an implicit flush of the command-queue.

To use event objects that refer to commands enqueued in a command-queue as event objects to 

wait on by commands enqueued in a different command-queue, the application must call a 

clFlush or any blocking commands that perform an implicit flush of the command-queue where 

the commands that refer to these event objects are enqueued.



이벤트 오브젝트에 관한 내용은


http://www.khronos.org/registry/cl/specs/opencl-1.x-latest.pdf#page=116


clFlush는 이벤트 오브젝트를 사용할 때만 효용성이 있는듯하다.




블러킹 커맨드가 finish가 아닌 flush를 포함하고 있다는 내용은


커맨드큐가 OOO(out of order)로 정의 되어 있을 때를 말하는 듯하다.


커맨드큐가 IO(inorder)로 정의 되었다면, 블러킹 커맨드는 finish까지 포함할 것이다.






고민 해봤는데 특히 주목해야할 점은


clFinish가 동기화 포인트가 된다는 점이다.


IO일때는 마지막에 블러킹 함수를 큐하면 동기화가 이루어지겠지만,


OOO일때는 clFinish를 넣어야만 그전 함수가 모두 끝났다고 할 수있겠다.







뭘원하는지, 뭘대답했는지 모르게 횡설수설했네;

결국 쓰다보면 당연한것을...















반응형

'Program Language > OpenCL' 카테고리의 다른 글

amd opencl __constant  (0) 2012.06.20
standard functions in OpenCL  (0) 2012.06.04
clBuildProgram  (1) 2012.06.02
OpenCL Address Spaces  (0) 2012.06.02
clEnqueueCopyBufferRect vs clEnqueueWriteBufferRect  (0) 2012.05.22

댓글