2014-02-09 3 views
0

몇 년 전에 단일 CPU 코어의 N 개의 유사한 작업을 연속적으로 계산하는 프로젝트를 작성했습니다.분기 분기가 높은 작업을 수행하는 최상의 전략

이러한 N 개의 작업은 완전히 독립적이므로 병렬로 계산할 수 있습니다.

그러나 이러한 작업의 문제점은 각 작업 내의 제어 흐름이 한 작업에서 다른 작업으로 많이 다르기 때문에 CUDA에서 구현 된 SIMT 방식이 도움보다 방해가 될 가능성이 높습니다.

스레드에 대한 종속성을 깨기 위해 각각 하나의 스레드로 N 개의 블록을 시작하는 아이디어가 떠 올랐습니다.

누구나이 상황에서 계산을 최적화하는 더 좋은 방법을 제안하거나 내 솔루션으로 가능한 함정을 지적 할 수 있습니까?

+1

본인은 더 이상의 세부 질문없이이 질문에 대답 할 수 없다고 생각합니다. 아시다시피 분기는 워프의 모든 스레드가 분기를 통해 동일한 경로를 따르지 않는 경우에만 문제가됩니다. 그래서, 나는 말할 것이다. 통계적으로 동일한 제어 흐름을 가진 모든 사람들이 가능한 경우 같은 경로를 따르도록 작업을 구성하십시오. – JackOLantern

+0

적어도 하나의 스레드가 다른 스레드와 다른 경로를 따르는 경우 분기가 문제가되는 것으로 생각합니다. 다음 공통 명령에서 실행을 진행하기 전에이 스레드를 모두 대기해야하기 때문입니다. 최악의 경우 하나의 워프에있는 32 개의 스레드는 서로를 기다렸다가 연속적으로 하나씩 실행합니다. 이는 32 배의 속도 저하를 의미합니다. 내가 잘못? – NAlexN

+1

당신 말이 맞아요. 위의 내 의견은 자신의 의견과 모순되지 않습니다. 저는 말합니다 : 워프가 지점을 통해 같은 경로를 따를 확률을 최대화하기 위해 작업을 구성하십시오. 나는 더 이상의 정보가 없을 때 더 잘 말할 수 없다. 내가 제안 할 수있는 또 다른 한 가지는 가능한 경우 제어 흐름을 피함으로써 문제를 완전히 재구성하는 것입니다 (레거시 소프트웨어를 무시할 수도 있음). 마지막으로, 문제가 더 구체적으로 나타나고 특정 문제가 있음을 언급하고 병목 현상을 재현하는 작은 예제를 게시하십시오. – JackOLantern

답변

2

워프에서 스레드의 발산으로 인한 원인과 원인을 사용자의 의견과 함께 수 있습니다. 그러나 사용자가 언급 한 구성 (각 블록 당 1 스레드)을 실행하면 GPU의 잠재력이 완전히 감소합니다. 워프/반 워프의 스레드는 결국 단일 다중 프로세서에서 병렬로 실행되는 스레드의 최대 단위입니다. 따라서 블록에 하나의 스레드가 있고 32 개의 블록이있는 것은 실제로 서로 다른 경로의 워프에 32 개의 스레드가있는 것과 같습니다. 첫 번째 경우는 다중 프로세서 당 숫자 상주 블록이 매우 제한되어 있기 때문에 더욱 심각합니다 (컴퓨팅 기능에 따라 8 개 또는 16 개).

따라서 GPU의 잠재력을 최대한 활용하려면 Jack의 의견을 기억하고 스레드를 재구성하여 단일 워프의 스레드가 동일한 실행 경로를 따르도록하십시오.