CUDA 스레드는 매우 가볍기 때문에 페널티가 거의 발생하지 않고 예약/정지 될 수 있습니다. 이는 실행 및 실행 전환에 많은 오버 헤드가있는 CPU 스레드와는 다릅니다. 결과적으로 CPU는 작업 병렬 처리에 적합하며 GPU는 데이터 병렬 처리에 탁월합니다. 스레드의 블록을 실행할 각각의 (NVIDIA) GPU는 "스트리밍 멀티 프로세서」(SMS)를 갖는 CUDA 아키텍처
- . 각 SM에는 일련의 스트림 프로세서 (SP)가 있으며 각 SP는 특정 순간 (주기)에 하나의 스레드에 대한 명령어를 실행합니다.
사실 블록 내부의 최소 스레드 수는 1입니다. 블록 당 스레드가 하나만 있으면 코드가 올바르게 실행됩니다. 그러나 블록을 32 개의 스레드의 배수가되도록 설정하는 것이 훨씬 더 효율적입니다. 이것은 하드웨어가 32 스레드 인 "워프"를 통해 작업을 예약하는 방식 때문입니다.
프로그램을 교차 컴파일 할 수 있습니다. 에뮬레이션 모드에서 실행할 수 있습니다. 즉, CPU가 CUDA GPU를 "에뮬레이션"하지만 하드웨어에서 실행하려면 NVIDIA GPU (CUDA 사용 가능, 2006 년 이후의 모든 것이 가능)가 필요합니다.
하이 엔드 현재 세대의 GPU는 240 개의 코어 (SPS), 당신이 어떤 주어진 순간에 240 개 스레드를 실행으로 이것을 고려할 수있다하지만 수천 개의 동시 스레드의을 실행으로 GPU 생각하는 것이 유용하다 여러 스레드에 대한 상태 (컨텍스트)가로드되기 때문입니다.
CPU 스레드와 GPU 스레드간에 차이가 있음을 인식하는 것이 중요하다고 생각합니다. 그것들은 같은 이름을 가지고 있지만 GPU 스레드는 가벼우 며 일반적으로 데이터의 작은 하위 집합에서 작동합니다. 어쩌면 비 병렬 작업을하는 CPU 스레드를 생각한 다음 각 CPU 스레드가 데이터 병렬 작업을 위해 수천 개의 GPU 스레드를 포킹 한 다음 다시 CPU 스레드에 참여하는 것을 생각해 보는 것이 도움이 될 것입니다.분명히 GPU와 같은 시간에 CPU 스레드가 작업을 수행 할 수 있다면 훨씬 더 좋습니다.
CPU와 달리 GPU는 처리량 아키텍처이므로 대기 시간을 숨기기 위해 캐시 대신 스레드가 많은 스레드를 생성해야 메모리에서 데이터가 반환 될 때까지 기다릴 수 있습니다. 실행 중. 자세한 내용은 GPU Technology Conference에서 "CUDA 용 고급 C"대화를 시청하는 것이 좋습니다.
출처
2009-12-30 19:24:51
Tom
이것은 하드웨어 설계의 제약 사항입니다. 그래서 각각 10 개의 스레드로 2 개의 블록을 생성하면 어떻게됩니까? 나는 ATI 카드를 가지고 있으며, -deviceemu를 사용하지 않고도 cuda와 c로 작성된 코드를 컴파일하고 "실행할"수있었습니다. 어떻게 작동합니까? 나는 또한 하나의 질문이있다 : gpu 쓰레드와 cuda 쓰레드의 차이는 무엇인가? 이 답이 맞습니다 : CPU가 1 개 이상 있지 않으면 CPU가 스레드를 순차적으로 실행합니다. 그래서 이중 중핵 cpu는 단지 2 개의 실을 동시에 달릴 수있다. 많은 스트리밍 프로세서가 있기 때문에 GPU는 병렬로 스레드 블록을 실행합니다. – scatman
> 2 블럭/10 스레드 이들은 비효율적으로 실행됩니다. ATI에서 CUDA를 실행할 수 없습니다.CUDA를 실행하려면 NVIDIA 카드가 필요합니다. cpu/gpu 스레드를 올바르게 특성화했습니다. – goger
(1) 각 SM은 각 SP가 아닌 블록을 실행합니다. (2) 이것은 제한 사항이 아닙니다. 블록 당 최소 스레드 수는 1입니다.이 경우 프로그램이 올바르게 작동하지만 효율적인 활용을 위해서는 블록 당 32 개의 스레드를 여러 개 사용해야합니다. 50 %는 GT200 프로세서에서 합리적인 "점유율"로 메모리 대기 시간을 숨김). (3) 코드가 실제로 에뮬레이션 모드에서 실행 중입니다. – Tom