2013-02-14 1 views
5

스레드 인덱스가 큰 스레드에서 어떻게 빠져 나갈 수 있는지 궁금합니다. 모두가 올바른지,CUDA의 발산 - 커널 스레드 종료

int i = threadIdx.x; 
if(i >= count) 
    return; 
// do logic 

또는

int i = threadIdx.x; 
if(i < count) { 
    // do logic 
} 

내가 알고 있지만, 어느 쪽이 더 성능에 영향을 : 나는 두 가지 가능성을 볼?

+0

둘 다 당신에게 동일한 성능을 제공 할 것입니다. – sgarizvi

답변

3

성능면에서 모두 동일하지만 첫 번째 권장 사항은 권장되지 않습니다.

커널 내의 스레드를 반환하면 나머지 코드에서 예기치 않은 동작이 발생할 수 있습니다.

예상치 못한 동작이란 워프에서 그룹화 된 스레드의 최소 단위와 관련된 문제입니다. 예를 들어 커널에 if/else 블록이있는 경우이 상황을 스레드 분기라고하며, 정상적인 경우 스레드가 유휴 상태로 남아 있고 일부는 일부 명령을 실행합니다. 예 도서, 제 5 장, 스레드 협력하여

CUDA는 :

그러나 __syncthreads의 경우

(), 결과는 다소 비극적이다. 쿠다 아키텍처는 어떤 스레드가

그래서, 그것은 커널 내에서 스레드 동기화에 주로 관련이있다()을 __syncthreads를 실행 한 블록의 모든 스레드까지 __syncthreads()을 넘어 명령에 진출 없다는 것을 보장합니다. 여기에서이 주제에 대한 아주 좋은 질문/답을 찾을 수 있습니다 Can I use __syncthreads() after having dropped threads? 내가 마지막 주, 나는 또한 나쁜 관행와 아무 문제가 나타난 것을 사용했습니다으로

하지만 문제는 미래에 발생할 수있는 보장은 없습니다 . 그것은 내가 권하고 싶지 않은 것입니다

+2

예기치 않은 행동이 무엇을 의미합니까, 문제가 무엇입니까? 나는 자습서에서 그것을 보았고 나는 또한 그것을 사용했고 아무 문제도 나에게 지금까지 나타나지 않았다. –

+0

클레임에 대한 참조를 제공해주십시오. – RoBiK

+0

@GeorgeAprilis이 문제는 주로 _good practices _ 및 블록 내의 향후 동기화와 관련이 있습니다. – pQB