2009-12-30 3 views
2

나는 GPU 프로그래밍에 관한 연구를하고 있으며 CUDA에 대해 더 알고 싶습니다. 난 이미 (위키 백과, 엔비디아와 다른 참조에서) 그것에 대해 많이 읽었습니다하지만, 난 여전히 몇 가지 질문이 있습니다cuda에 관한 질문

  1. 를 GPU의 멀티 프로세서를, 모든 멀티가 한가? 정확한 아키텍처의 설명이다 스트리밍 프로세서 및 모든 스트리밍 프로세서는 동시에 스레드 블록을 실행할 수 있습니다.

  2. 모든 참조는 한 블록 안에 만들 수있는 스레드의 최소 수가 32 개라고 말하면서 왜 그런가요?

  3. ATI Radeon 비디오 카드가 있습니다. 에뮬레이션 모드없이 간단한 CUDA 프로그램을 컴파일 할 수있었습니다 !! 지원되는 Nvidia VGA에서만 CUDA 프로그램을 컴파일하고 실행할 수 있다고 생각했습니다. 누군가 설명해 주시겠습니까?

답변

6

1 - 이것은 NVIDIA gpus에 해당됩니다.

2 - 이것은 하드웨어 설계의 제약 사항입니다.

3 - 컴파일이 CPU에서 수행되므로 x86에서 PPC에 대해 크로스 컴파일 할 수있는 것처럼 프로그램을 컴파일 할 수 있습니다.

ATI 카드에서 gpu 프로그램을 실행하려면 OpenCL 또는 AMD Stream을 참조하십시오.

+0

이것은 하드웨어 설계의 제약 사항입니다. 그래서 각각 10 개의 스레드로 2 개의 블록을 생성하면 어떻게됩니까? 나는 ATI 카드를 가지고 있으며, -deviceemu를 사용하지 않고도 cuda와 c로 작성된 코드를 컴파일하고 "실행할"수있었습니다. 어떻게 작동합니까? 나는 또한 하나의 질문이있다 : gpu 쓰레드와 cuda 쓰레드의 차이는 무엇인가? 이 답이 맞습니다 : CPU가 1 개 이상 있지 않으면 CPU가 스레드를 순차적으로 실행합니다. 그래서 이중 중핵 cpu는 단지 2 개의 실을 동시에 달릴 수있다. 많은 스트리밍 프로세서가 있기 때문에 GPU는 병렬로 스레드 블록을 실행합니다. – scatman

+0

> 2 블럭/10 스레드 이들은 비효율적으로 실행됩니다. ATI에서 CUDA를 실행할 수 없습니다.CUDA를 실행하려면 NVIDIA 카드가 필요합니다. cpu/gpu 스레드를 올바르게 특성화했습니다. – goger

+0

(1) 각 SM은 각 SP가 아닌 블록을 실행합니다. (2) 이것은 제한 사항이 아닙니다. 블록 당 최소 스레드 수는 1입니다.이 경우 프로그램이 올바르게 작동하지만 효율적인 활용을 위해서는 블록 당 32 개의 스레드를 여러 개 사용해야합니다. 50 %는 GT200 프로세서에서 합리적인 "점유율"로 메모리 대기 시간을 숨김). (3) 코드가 실제로 에뮬레이션 모드에서 실행 중입니다. – Tom

6

CUDA 스레드는 매우 가볍기 때문에 페널티가 거의 발생하지 않고 예약/정지 될 수 있습니다. 이는 실행 및 실행 전환에 많은 오버 헤드가있는 CPU 스레드와는 다릅니다. 결과적으로 CPU는 작업 병렬 처리에 적합하며 GPU는 데이터 병렬 처리에 탁월합니다. 스레드의 블록을 실행할 각각의 (NVIDIA) GPU는 "스트리밍 멀티 프로세서」(SMS)를 갖는 CUDA 아키텍처

  1. . 각 SM에는 일련의 스트림 프로세서 (SP)가 있으며 각 SP는 특정 순간 (주기)에 하나의 스레드에 대한 명령어를 실행합니다.

  2. 사실 블록 내부의 최소 스레드 수는 1입니다. 블록 당 스레드가 하나만 있으면 코드가 올바르게 실행됩니다. 그러나 블록을 32 개의 스레드의 배수가되도록 설정하는 것이 훨씬 더 효율적입니다. 이것은 하드웨어가 32 스레드 인 "워프"를 통해 작업을 예약하는 방식 때문입니다.

  3. 프로그램을 교차 컴파일 할 수 있습니다. 에뮬레이션 모드에서 실행할 수 있습니다. 즉, 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"대화를 시청하는 것이 좋습니다.

+0

이므로 블록 수 (그리드 크기)는 SM 수와 같아야하지만 스레드 수는 최상의 성능을 위해 SP 수와 같아야합니다. 이게 옳은 거니? – scatman

+0

아닙니다. 블록의 스레드 수는 워프 크기의 배수 여야합니다 (SP 수는 8입니다). 이상적으로 이것은 128과 비슷하지만 응용 프로그램에 따라 다릅니다. 일반적으로 특히 시작할 때 블록 수는 수백 (또는 수천)이어야합니다. 이는 하드웨어가 리소스를 사용할 수있는 경우 하나의 SM에서 여러 블록을 예약 할 수 있기 때문에 SM에서 더 많은 스레드가 실행되고 있음을 의미하기 때문입니다. 또한 코드가 현재는 물론 미래의 다른 장치에서도 원활하게 확장 될 수 있음을 의미합니다. – Tom

+0

제공하신 링크는 매우 도움이되었습니다. 나는 여전히 하나의 질문이 있습니다 : SM의 모든 SP는 자체 레지스터와 로컬 메모리를 하드웨어로 가지고 있습니까? 또는 커널이 점심을 먹었을 때 모든 SP에 나누어지는 1 개의 레지스터와 1 개의 로컬 메모리가 있습니까? 공유 메모리에 대해 동일한 질문이 있습니다. 모든 SM에 1 개의 공유 메모리가 있습니까? 또는 모든 GPU에 대해 1 개의 공유 메모리가 있으며, 커널이 점심을 먹었을 때 논리적으로 분리되어 있습니까? – scatman

2
  1. 예. 모든 GPU는 벡터 프로세서 또는 SIMD (단일 명령 다중 데이터) 프로세서의 배열입니다. 스레드의 단일 벡터 (32, 64 또는 GPU에 따라 다른 수) 내에서 각 스레드는 잠금 단계에서 커널의 동일한 명령어를 실행합니다. 이 기본 단위는 때때로 "워프"또는 "파면"또는 때로는 "SIMD"라고도합니다.

    32는 NVidia 칩의 경우 일반적으로, ATI의 경우 64입니다. IIRC, Itel의 Larrabee 칩은 그 칩이 제조된다면 훨씬 더 많을 것으로 예상됩니다.

  2. 하드웨어 수준에서 스레드는 이러한 단위로 실행되지만 프로그래밍 모델을 사용하면 임의의 수의 스레드를 가질 수 있습니다. 하드웨어가 32 와이드 웨이브 프론트를 구현하고 프로그램이 스레드 1 개만 요청하면 해당 하드웨어 장치의 31/32가 유휴 상태가됩니다. 32 (또는 무엇이든)의 배수로 쓰레드를 생성하는 것이 가장 효율적인 방법입니다 (모든 쓰레드가 유용하도록 프로그래밍 할 수 있다고 가정 할 때).

    하드웨어에서 실제로 발생하는 일은 각 스레드에 적어도 하나의 비트가 있다는 것입니다. 스레드가 "활성"인지 여부를 나타냅니다. 32 웨이브 프론트의 여분의 쓰레드는 실제로 계산을 수행하지만 결과를 메모리 위치에 쓸 수 없으므로 마치 실행되지 않은 것처럼 보입니다.

    GPU가 일부 게임에서 그래픽을 렌더링 할 때 각 스레드는 단일 픽셀 (또는 앤티 앨리어싱이 켜져있는 경우 하위 픽셀)을 계산하고 렌더링되는 각 삼각형은 임의의 픽셀 수를 가질 수 있습니다. 맞습니까? GPU가 32 픽셀의 정확한 배수를 포함하는 삼각형 만 렌더링 할 수있는 경우 GPU가 제대로 작동하지 않습니다.

  3. 고거의 대답은 모두 다.

  4. 특별히 묻지는 않았지만 GPU 커널이 ​​분기를 피하는 것이 중요합니다. 웨이브 프론트에있는 32 개의 스레드가 모두 같은 명령을 동시에 실행해야하기 때문에 코드에 if .. then .. else이 있으면 어떻게됩니까? 워프의 일부 스레드가 "then"부분을 실행하려고하고 일부 스레드가 "else"부분을 실행하려고한다면? 대답은 32 개의 모든 스레드가 두 부분을 모두 실행한다는 것입니다! 두 배의 시간이 걸리므로 커널이 절반 속도로 실행됩니다.

+0

추가 포인트 주셔서 감사합니다 :) – scatman