종종 처리해야하는 "요소"의 논리적 인 양과 동일하게 유지하는 것이 좋습니다. 내 응용 프로그램에는 그런 것이 없다. N
요소를 처리해야하는 경우 단일 커널을 통과 한 후 M
요소를 갖게됩니다. 즉, N
에 의존하지 않는 완전히 다른 숫자입니다.처리 할 요소의 수가 무작위로 늘어날 때 고정 된 global_work_size 및 local_work_size를 유지하는 것은 좋지 않은 생각입니까?
이 상황에 대처하기 위해, 나는 같은 루프를 작성할 수
while (elementsToBeProcessed)
read "elementsToBeProcessed" variable from device
enqueue ND range kernel with global_work_size = elemnetsToBeProcessed
하지만 그 패스 당 하나 개의 읽기가 필요합니다. GPU 레이아웃과 일치하는 고정 된 global_work_size 및 local_work_size로 enqueueNDRangeKernel
을 한 번만 호출 한 다음 모든 스레드를 사용하여 GPU 내부의 모든 작업을 동기화 할 수 있습니다.
제 질문은 간단합니다. 두 번째 옵션이 더 좋다고 내 직감이 맞습니까? 아니면 첫 번째 옵션과 함께 갈 이유가 있습니까?
물론 이것은 OpenCL 1.x 용입니다. OpenCL 2.0에 액세스 할 수 있으면 파이프 또는 동적 병렬 처리를 사용하십시오. – Dithermaster
점차적으로 값을 줄이기 위해 "읽은 마지막 값 읽기"의 인터리브 접근 방식을 좋아합니다. – DarkZeros
감사합니다 @DarkZeros; 당신에게서 오는 것은 진정한 칭찬입니다! – Dithermaster