2017-10-07 2 views
1

OpenCL 모범 사례 가이드 (https://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/cuda-doc/OpenCL_Best_Practices_Guide.pdf)는 명령이 올바른 순서로 발생하도록하기 위해 섹션 3.1.3에서 clFlush을 사용하도록 제안합니다. , queue0 오버랩 전송 및 실행 : 명령이 올바른 순서로 수행되는지 확인하십시오.

  • 실행 queue0에 대한 커널 queue0
  • clFlush의 데이터

    1. 전송 queue1을
    2. queue0에 대한 clFlush 및 queue1을
    3. 에 대한 데이터를 전송 : 처리는 데이터 전송 전에 발생하지 않습니다
    4. queue1에 대해 커널을 실행하고 queue0에 대한 데이터를 검색하십시오.
    5. clFlush 둘 다
    6. 대기열에 대한 데이터 검색

    여기에서 응답 https://stackoverflow.com/a/12389713/4634819은 이벤트를 사용하여 동일하게 보이도록 제안합니다.

    내 질문에 : 내가 맞았는데, clFlush과 이벤트가이 경우에 (동시 실행을 피하기 위해) 동일한 목적을 수행합니까? 그들 중 어느 것이 중요합니까?

  • 답변

    4

    clFlush는 enqueue 기능이 데이터 전송이나 커널 실행을 대기열에 넣을 수 있도록 보장하지만 사용자가 호출 한 기능을 보장하지는 않습니다. 이벤트를 사용해야하는 경우는 여러 가지가 있습니다.

    1 - 데이터 전송에 비 차단 호출을 사용하는 경우 이벤트를 사용하여 실행을 시작하기 전에 모든 이벤트 전송을 완료해야합니다 커널로 복사하고 호스트로 다시 복사 할 때, 읽기 이벤트가 완료 될 때까지 기다려야합니다.

    2 - 두 대기열에서 실행중인 커널 사이에 종속성이있는 경우 다시 올바른 방법으로 커널을 주문하려면 이벤트를 사용해야합니다.

    그래서 질문은 커널 실행 사이에 어떤 종류의 종속성이 있으며 데이터를 전송하기 위해 비 차단 호출을 사용하는지 여부에 따라 달라집니다. 의존성이없고 데이터 전송에 블로킹 호출을 사용하는 경우 clFlush가 작업을 수행합니다. 그렇지 않으면 이벤트가 필요합니다.

    +0

    감사합니다. 모든 것은 지금 분명합니다 :) – vgeclair

    관련 문제