2014-12-03 3 views
2

계산 결과에 문제가 있습니다. 이유가 무엇인지에 대한 설명이 정확하지 않아 코드를 확인한 결과 올바른 것으로 보입니다 (다시 확인하겠습니다).추력에 대한 호출 후 CUDA 커널이 시작되면 동기식 또는 비동기식입니까?

제 질문은 추력에 대한 호출 후에 실행 된 후 사용자 정의 쿠다 커널이 동기식 또는 비동기식인지 여부입니다.

thrust::sort_by_key(args); 
arrangeData<<<blocks,threads>>>(args); 

thrust::sort 후 커널 arrangeData 실행이 완료됩니다?

답변

5

코드가 그렇게 보이고 스트림 사용이 없다고 가정하면 (커널 호출과 추력 호출이 게시 한대로 스트림 사용을 나타냄) 두 작업 모두 기본 스트림에 발행됩니다. 나는 또한 추측 호에 args이 전달 된 것이 장치 인수가 아니라 호스트 인수라고 가정합니다 (이 경우 내 대답을 변경하지는 않겠지 만). (예 : device_vector, host_vector 아님).

기본 스트림 (또는 임의의 단일 스트림)에 발행 된 모든 CUDA API 및 커널 호출이 순서대로 실행됩니다.

arrangeData 커널 thrust::sort_by_key 호출로 시작된 커널이 완료 될 때까지을 시작하지 않습니다.

프로필러를 사용하여이를 확인할 수 있습니다 (예 : 동기비동기 약간 혼동 될 수 있음은 nvvp

참고. 우리가 커널을 비동기로 시작한다는 것에 관해서는 항상 거의 항상 호스트 CPU 활동을 언급하고 있습니다. 즉, 커널 시작은 호스트 스레드에 대한 비동기식 입니다. 즉, 호스트 스레드에 즉시 제어를 반환하고 실행은 호스트 스레드에 대해 지정되지 않은 시간에 발생합니다.

동일한 스트림에 발행 된 CUDA API 호출과 커널 호출은 항상 서로 동기화됩니다. 주어진 커널은 이전의 모든 큐다 활동 (심지어는 cudaMemcpyAsync과 같은 것)까지 완료 될 때까지 실행을 시작하지 않습니다.