2012-05-07 4 views
0

큰 배열에서 커널을 실행 중입니다. clEnqueueNDRange 명령을 프로파일 링하면 실행 시간 (end-start)은 .001 ms이지만 제출 및 시작 (시작 - 제출) 사이의 시간은 입력 데이터의 크기에 따라 달라지는 약 120 ms입니다. 명령이 실행될 때까지 명령을 제출하면 어떻게됩니까? 이 큰 시간을 갖는 것이 합리적입니까?OpenCL에서 명령을 제출하고 시작하는 데 걸리는 시간이 오래 걸림

+0

커널의 결과가 필요한 clEnqueueNDRange 호출 후에 뭔가가 있습니까? 예를 들어, 커널 뒤에 clEnqueueMapBuffer가 블로킹되어 있습니까? 그렇지 않은 경우, 구현은 커널의 실행을 지연 시킬지 결정할 수 있습니다. – boiler96

+0

예 결과를 읽은 후 두 개의 clEnqueueReadBuffer가 있지만 비 차단 호출로 결과를 읽을 수는 없습니다. 또한 clEnqueueMapBuffer 내게 잘못된 결과를주는 몇 가지 문제가있는 것 같습니다. 어쨌든 비 차단 호출로 데이터를 읽을 수 있습니까? – Damoon

답변

0

OpenCL은 비동기 적으로 작동합니다. 즉, 일할 것을 요구할 때 그 일은 일어나지 않을 수도 있습니다. 그것은 미래의 어느 시점에 일어날 것입니다. 이것은 약간 이상합니다. 특히 프로파일 링을 시작할 때 특히 그렇습니다.하지만 CPU가 OpenGL 장치에 대한 많은 작업을 큐에 넣을 수 있도록 작업 한 다음 작업이 완료되는 동안 다른 작업을 수행하십시오. 예를 들어

:

여기
clEnqueueWriteBuffer(blah); 
clEnqueueNDRange(blah); 
clEnqueueReadBuffer(blah, but blocking_read = CL_TRUE); 

의 writeBuffer과 NDRange 아마 시간의 매우 적은 양을 나타납니다. 그들이해야 할 일은해야 할 일을 기록하는 것입니다. 블로킹 readBuffer는 읽기 결과를 기다려야하기 때문에 시간이 오래 걸립니다. 읽기가 완료되기 전에 읽기 및 커널 시작이 완료되기 전에 쓰기 및 커널 실행이 완료되어야합니다.

이제 읽기는 매우 작을 수 있습니다. 그러나 읽는 시간이 끝나기 전에 모든 것을 기다리고 있기 때문에 그 전에 걸린 명령의 작업량에 따라 달라집니다.

나는 당신이 당신의 질문에서 무엇을 측정하는지 잘 모르지만, 당신이보고있는 것이이 효과라고 기대합니다. 이전 작업이 끝날 때까지 기다려야하기 때문에 작업 시간은 다른 기능에 청구됩니다.

고성능 코드를 작성할 때 어떤 기능이 CPU를 GPU에서 대기하게하는지 알면 큰 트릭 중 하나입니다. 이럴 때마다 CPU가 어떤 유용한 작업을 중단하고 CPU가 다음 작업을 준비하는 동안 GPU가 유휴 상태가 될 가능성이 있습니다. 때로는 대안이 없기 때문에 기다려야합니다.

관련 문제