"SIMT"아키텍처의 개념과 디자인 중 일부는 여전히 나에게 불분명합니다.OpenCL : SIMT 실행 모델에 대한 기본 질문
많은 스레드가 잠금 단계에서 실행될 수 있기 때문에 코드 경로와 if()를 분산시키는 것은 다소 나쁜 생각입니다. 이제 그게 정확히 무슨 뜻입니까? 다음과 같은 경우는 어떻습니까?
kernel void foo(..., int flag)
{
if (flag)
DO_STUFF
else
DO_SOMETHING_ELSE
}
"플래그"매개 변수는 모든 작업 단위에서 동일하며 모든 작업 단위에서 동일한 분기가 수행됩니다. 그럼, GPU가 모든 코드를 실행하고, 그럼에도 불구하고 모든 것을 직렬화하고 기본적으로 아직 수행되지 않은 분기를 취할 것입니까? 아니면 조금 더 똑똑하고, 모든 스레드가 지점에 동의하는 한 찍은 지점 만 실행합니다. 어느 쪽이 항상 여기에있을 것입니다.
e.e. 직렬화는 항상 발생합니까 아니면 필요한 경우에만 발생합니까? 바보 같은 질문에 사과드립니다. ;)
정확하게 중요하지 않습니다. 성능 유지에 중요한 요소입니다. 이것은 브랜치의 복잡성에 달려 있지만 적어도 지금까지 대부분의 상황에서 발생했지만, 브랜치가 평가되는지 확인하는 것보다 메모리 액세스를 최적화하는 것이 더 중요했습니다 (통합, 뱅크 충돌 방지, 트래픽 감소). 동일한 경로 (경우에 따라 이러한 최적화에 대해 효과가 있었음). – Grizzly
@ Grizzly 브랜치를 사용하는 경우 매우 중요합니다. –