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 |
댓글