2010-08-23 3 views
5

CUDA 응용 프로그램 (this if you must know)을 OpenCL로 변환하려고합니다. 원래 응용 프로그램은 C 스타일 CUDA API를 사용하며 결과를 읽을 때 자동 대기 중 대기를 피하기 위해 단일 스트림을 사용합니다.OpenCL 이벤트 및 명령 대기열

이제 OpenCL 명령 대기열이 CUDA 스트림처럼 보입니다. 그러나 the device read command에서 write 및 kernel 명령을 실행하는 것과 마찬가지로 이벤트에 대한 매개 변수도 인식합니다. 그래서 장치 쓰기, 여러 커널 (예 : 하나의 커널 호출 한 다음 다른 커널 호출 100) 및 장치 읽기를 순차적으로 실행하려면 무엇이 필요합니까?

  1. 큐를 큐에 순차적으로 큐에 넣으면 CUDA와 같이 순차적으로 실행됩니까?
  2. 그래도 문제가 해결되지 않으면 이벤트의 데이지 체인을 통해 각 통화 대기 목록에 이전 통화의 일정을 표시 할 수 있습니까?
  3. 또는 N^2 의존성 검색과 같은 모든 이전 이벤트를 각 통화 대기 목록에 추가해야합니까?
  4. AMD's tutorial에있는 것처럼 각 통화마다 event.wait()를 개별적으로 수행해야합니까?

고마워요!

답변

5

명령 대기열을 만드는 방법에 따라 다릅니다. clCreateCommandQueue에는 명령 대기열에서 비 순차적 실행을 가능하게하는 CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE을 포함 할 수있는 속성 매개 변수가 있습니다.

해당 속성이 설정된 경우 명령이 순서가 잘못되거나 병렬로 실행될 수 있으며이를 동기화하는 유일한 방법은 이벤트를 사용하는 것입니다.

해당 속성을 설정하지 않으면 명령이 큐에서 순차적으로 실행됩니다.

+0

한 곳으로 생각하지 않았습니다. 감사! –

+0

"대부분 받아 들였습니다"라고 제 진술을 수정해야합니다. 순서대로 대기열에있는 여러 커널이 순서대로 계산한다는 것은 사실입니다. 그러나 버퍼 읽기 및 쓰기는 이벤트 * 및 * 대기를 모두 사용하지 않는 한 순서가 잘못된 것처럼 보입니다. 아마도 읽기/쓰기가 동기식으로 지정되어 있어도 가능합니다. 작업 예제는 BOINC (boinc.berkeley.edu)의 atiopencl 예제를 참조하십시오. –

+0

CL이 작동하는 방식이 아닙니다. 명령 대기열 생성에 대한 OpenCL 사양 섹션 5.1을 참조하십시오. 다른 동작이 보이는 경우 구현 오류입니다 (버그). –