본문 바로가기
Program Language/OpenCL

NVIDIA clEnqueueReadBuffer non-blocking bug(?)

by Leo 리오 2012. 11. 2.
반응형

clEnqueueReadBuffer를 CL_FALSE로 불러도 계속 read될때 까지 기다린다.

Intel CPU OpenCL은 non-blocking이 잘 된다.

AMD는 안해봤는데 아마 잘 될듯하다.


이걸로 1.5일을 헤매었다.


CUDA 4.2.1

OpenCL 1.1을 사용 하였다.


NVIDIA는 끝까지 OpenCL을 숨기려는듯하다.

OPENCL 페이지도 없어지고,

1.2도 공개안하고, VisualProfiler도 CUDA 5.0에선 작동을 안한다.


째튼 

NVIDIA 예제코드도 확인결과 다 blocking 된다. overrap예제만 빼고.. 

뭐가 다른가

lib? inc? 다 바꿔봤지만 그대로..

context? device? queue? 다 똑같다.



결론은

asynchronous pinned transfers 쓰자.


보통

cl_mem deviceResult;

char* hostResult = malloc();

clEnqueueReadBuffer(hostResult, deviceResult, CL_FALSE);

이렇게 들어가는데 clEnqueueReadBuffer가 계속 기다린(blocking)다.


cl_mem deviceResult;

char* hostResult = clEnqueueMapBuffer(deviceResult,CL_TRUE);

clEnqueueReadBuffer(hostResult, deviceResult, CL_FALSE);

이런식 pinned로 하니깐 non-blocking이 가능했다...


pinned로 하면 특정메모리에 밖에 읽을 수가 없어 구현이 좀 복잡해지긴 하지만,

속도(bandwidth)도 빨라지고 하니 이렇게 구현하는게 좋을 것이다.



반응형

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

global memory replay overhead  (0) 2012.12.21
[CUDA] occupancy  (0) 2012.11.07
Intel opencl platform analyzer  (0) 2012.10.15
DeviceQuery  (0) 2012.10.08
OpenCL 포팅  (0) 2012.10.05

댓글