GPU 대신 CPU를 사용하면 어떤 이점이 있습니까?


63

프로세서와 그래픽 카드를 연구하고 있는데 GPU가 CPU보다 훨씬 빠릅니다. 이 기사 에서 2 세의 Nvidia GPU가 특정 상황에서 3.2GHz 코어 I7 인텔 프로세서보다 14 배나 높은 성능을 보였습니다. GPU가 그렇게 빠르면 개발자가 게임의 모든 기능에 GPU를 사용하지 않는 이유는 무엇입니까? GPU가 그래픽 이외의 다른 작업을 수행 할 수 있습니까?


17
모든 것을 GPU로 오프로드하는 게임에서 CPU가 거의 수행하지 않는 경우 일부로드를 CPU로 되돌려 성능을 향상시킬 수 있습니다.
Tetrad

3
GPU는 아마도 CPU보다 나을지 모르지만 비디오 카드가 메인 보드보다 낫다고 생각하지 않습니다 (그리고 OS와 드라이버를 비교하지 않겠습니다)
e-MEE

27
GPU is faster than a CPU: 많은 사람들이 특히 GPU를 위해 준비되어 문제를 기반으로 벤치 마크를보고 난 후에 믿게되는 거짓 신화는,이 슈퍼 유저 질문에 대한 내 대답을 참조 (문제의이 클래스는 "쩔쩔 매게 병렬 문제"라고합니다)는 우리가 여전히 사용하는 이유 GPU 대신 CPU?
Lie Ryan


5
한 가지 이점은 모든 컴퓨터가 :)는 CPU를 가지고 있다는 것입니다
팀 홀트

답변:


50

"F1 차량이 우리가 거리에서 운전하는 차량보다 빠르다는 것을 읽었습니다. 왜 사람들은 F1 차량을 사용하지 않습니까?" 글쎄요 ...이 질문에 대한 답은 간단합니다. F1 자동차는 대부분의 자동차만큼 빠른 속도로 고장 나거나 돌릴 수 없습니다. GPU의 경우는 매우 유사하며, 직선 처리를 따르는 것이 좋지만 다른 처리 경로를 선택할 때는 그리 좋지 않습니다.

GPU에서 실행되는 프로그램은 예를 들어 텍스처 A의 모든 픽셀을 텍스처 B의 픽셀과 블렌딩하여 텍스처 C에 모두 배치해야하는 경우와 같이 여러 번 병렬로 실행해야 할 때 의미가 있습니다. CPU는 다음과 같이 처리됩니다.

for( int i =0; i< nPixelCount; i++ )
     TexC[i] = TexA[i] + TexB[i];

그러나 많은 픽셀을 처리해야 할 때 속도가 느리므로 위의 코드를 사용하는 대신 GPU는 다음 픽셀을 사용합니다.

     TexC[i] = TexA[i] + TexB[i];

그런 다음 모든 코어를이 프로그램으로 채우고 (필수적으로 프로그램을 코어에 복사) i각각 에 대한 값을 지정합니다 . 그런 다음 GPU에서 마술이 나오고 모든 코어가 동시에 프로그램 실행 하게하여 선형 CPU 프로그램보다 훨씬 빠른 속도로 많은 작업을 수행 할 수 있습니다.

이 작업 방식은 많은 작은 입력을 같은 방식으로 처리해야 할 때 괜찮지 만 조건부 분기가있을 수있는 프로그램을 만들어야 할 때 실제로 나쁩니다. 이제 CPU가 어떤 상태 확인과 관련하여 무엇을하는지 봅시다 :

  • 1 : 첫 번째 논리 연산까지 프로그램을 실행
  • 2 : 평가
  • 3 : 비교의 메모리 주소 결과에서 계속 실행 (JNZ asm 명령어 사용)

CPU가 인덱스를 설정하는 것은 매우 빠르지 만 GPU가 동일하게 수행하는 것은 훨씬 더 복잡합니다. GPU의 전원은 동일한 명령을 동시에 실행함으로써 발생하므로 (SIM 코어) 칩 아키텍처를 활용하려면 동기화되어야합니다. 분기를 처리하기 위해 GPU를 준비해야한다는 것은 다소간 의미가 있습니다.

  • 1 : 분기 A 만 따르는 프로그램 버전을 만들고 모든 코어에이 코드를 채 웁니다.
  • 2 : 첫 번째 논리 연산까지 프로그램을 실행
  • 3 : 모든 요소 평가
  • 4 : 분기 A 다음에 오는 모든 요소를 ​​계속 처리하고 경로 B를 선택한 모든 프로세스를 큐에 넣습니다 (핵심에 프로그램이 없습니다!). 이제 경로 B를 선택한 모든 코어는 유휴 상태입니다. 최악의 경우 단일 코어가 실행되고 다른 모든 코어가 대기 중입니다.
  • 5 : 모두 처리가 완료되면 프로그램의 분기 B 버전을 메모리 버퍼에서 일부 작은 코어 메모리로 복사하여 활성화하십시오.
  • 6 : 지점 B를 실행하십시오.
  • 7 : 필요한 경우 두 결과를 혼합 / 병합하십시오.

이 방법은 많은 것들에 따라 다를 수 있습니다 (예 : 매우 작은 것)분기는 이러한 구분없이 실행할 수 있지만 이제 분기가 문제가되는 이유를 이미 알 수 있습니다. GPU 캐시는 매우 작기 때문에 VRAM에서 선형으로 프로그램을 실행할 수 없으며 실행하기 위해 작은 명령 블록을 코어에 복사해야하며 분기가 충분하면 GPU가 대부분 실행보다 정지됩니다 대부분의 프로그램이 여러 스레드에서 실행하는 경우에도 대부분의 프로그램이 수행하는 것처럼 하나의 분기 만 따르는 프로그램을 실행할 때는 의미가 없습니다. F1 예제와 비교할 때, 이것은 모든 구석에서 제동 낙하산을 연 다음 차에서 나와 다음 구석을 다시 돌리거나 빨간색 세마포어를 찾을 때까지 차 안에 다시 포장해야합니다 (다음 구석) 가장 가능성이 높습니다).

물론 다른 아키텍처가 훨씬 저렴하고 신뢰성이 높고, 표준화되고, 더 잘 알려져 있으며, 전력 효율이 높은 등 논리적 작업을 수행하는 데있어 문제가 있습니다. 최신 비디오 카드는 소프트웨어 에뮬레이션이없는 구형 비디오 카드와 호환되지 않습니다 동일한 제조업체의 제품이라도 서로 다른 asm 명령을 사용하며, 대부분의 컴퓨터 응용 프로그램에는 이러한 유형의 병렬 아키텍처가 필요하지 않으며 필요할 경우 OpenCL과 같은 표준 API를 통해 사용할 수 있습니다. eBusiness 또는 그래픽 API를 통해 언급했습니다. 아마도 수십 년 안에 우리는 CPU를 대체 할 수있는 GPU를 갖게 될 것이지만, 그것이 곧 일어날 것이라고는 생각하지 않습니다.

GPU 아키텍처에 대해 설명하는 AMD APP의 문서를 추천하고 CUDA 매뉴얼에서 NVIDIA 설명서를 보았으므로이를 이해하는 데 많은 도움이되었습니다. 나는 아직도 어떤 것들을 이해하지 못하고 오해 할 수도 있습니다. 아마도 더 많은 것을 아는 사람은 내 진술을 확인하거나 거부 할 수 있습니다.


6
이상한 비유이지만 좋은 지적입니다 the fastest isn't always the fastest.
Lie Ryan

1
감사! 많은 게임 프로그래밍 개념을 하드웨어가 작동하는 방식에 바인딩하기 때문에 흥미로운 주제라고 생각합니다. 오늘날의 고급 언어에서는 다소 잊혀졌습니다. 추가하고 싶은 다른 것들이 있지만 답변을 작성하는 데 이미 시간이 걸렸으므로 CPU의 "보호 모드"기능, 메모리 버스 속도 등과 같이 나중에 업데이트하려고 시도 할 것입니다. GPU에서 모든 것을 실행하는 기술적 인 단점.
Pablo Ariel

6
정확하다면 비유가 훨씬 나을 것입니다. F1 차량은 제동 능력이 뛰어나 사전에 제동을 시작하지 않고 곡선 속으로 더 높은 속도를 유지할 수 있습니다. 높은 다운 포스 덕분에 고속 코너링이 더 나아지지만 회전 반경이 주차장에는 적합하지 않을 수 있습니다. 더 좋은 이유는 보관 공간 부족, 백미러, 에어컨, 크루즈 컨트롤, 요소로부터 보호, 조수석, 서스펜션 및 지상 통행로가 좋지 않은 도로를 처리하거나 승용차에서 흔히 발생하는 다양한 것들을 포함 할 수 있습니다.
GargantuChet

5
@Pablo Ariel 저는 "F1 자동차는 대부분의 자동차만큼 빠르게 고장 나거나 돌릴 수 없습니다"라는 말에 응답하고 있습니다. F1 차량은 직선으로 만 가속 할 수 있으며 회전이나 감속 중에는 좋지 않습니다. 그러나 F1 자동차는 실제로 "대부분의 자동차"보다 훨씬 더 빠르게 제동 할 수 있으며 고속 코너링이 우수합니다.
GargantuChet

4
F1 차량이 아닌 Dragsters에서 생각하면 유추가 더 정확합니다.
Agustin Meriles

32

GPU는 병렬 작업이 매우 좋습니다. 병렬 작업을 실행하는 경우 좋습니다.

게임은 가장 병렬화가 어려운 응용 프로그램입니다. 메인 게임 루프에 대해 생각하십시오. AI (플레이어가 AI의 특수한 경우로 취급된다고 가정)는 물리에 의해 감지 된 충돌에 응답해야합니다. 따라서 나중에 실행해야합니다. 또는 적어도 물리학은 물리 시스템의 경계 내에서 AI 루틴을 호출해야합니다 (일반적으로 여러 가지 이유로 좋은 아이디어는 아닙니다). 물리학은 객체의 위치를 ​​업데이트하기 때문에 물리학이 실행될 때까지 그래픽을 실행할 수 없습니다. 물론 AI는 새로운 객체를 생성 할 수 있기 때문에 렌더링 전에 AI를 실행해야합니다. AI 및 플레이어 컨트롤 후에 소리를냅니다.

일반적으로 게임은 몇 가지 방식으로 스레드 할 수 있습니다. 스레드에서 그래픽을 분리 할 수 ​​있습니다. 게임 루프는 그래픽스 스레드에 많은 데이터를 넣을 수 있습니다. 기본 보간을 수행 할 수 있으므로 기본 게임 루프가 그래픽과 동기화 될 필요가 없습니다. 소리는 또 다른 실입니다. 게임 루프에 "play this"가 표시되고 재생됩니다.

그 후 모든 것이 고통스러워지기 시작합니다. 복잡한 경로 지정 알고리즘 (예 : RTS)이있는 경우 해당 알고리즘을 스레드 할 수 있습니다. 알고리즘을 완료하는 데 몇 프레임이 소요될 수 있지만 적어도 동시 적입니다. 그 외에도 꽤 어렵습니다.

따라서 게임, 그래픽, 사운드 및 장기 AI 처리의 4 가지 스레드를보고 있습니다. 그다지 중요하지 않습니다. 그리고 그것은 아니다 거의 한 번에 비행 문자 그대로 수백 개의 스레드를 가질 수 GPU를, 충분히. 이것이 GPU에 성능을 제공하는 것입니다. 모든 스레드를 한 번에 사용할 수 있습니다. 그리고 게임은 단순히 그렇게 할 수 없습니다.

이제는 일부 작업에서 "넓게"이동할 수 있습니다. 예를 들어 AI는 일반적으로 서로 독립적입니다. 따라서 한 번에 수십 개의 AI를 처리 할 수 ​​있습니다. 실제로 서로 의존해야 할 때까지. 그럼 넌 곤경에 빠졌어 물리 객체는 서로 독립되어 있습니다. 객체간에 제약이 있거나 무언가와 충돌하지 않는 한. 그런 다음 그들은 매우 의존적입니다.

또한 GPU가 단순히 사용자 입력에 액세스 할 수 없다는 사실이 있습니다. 이것은 내가 이해하는 것처럼 게임에 중요합니다. 그것이 제공되어야 할 것입니다. 또한 파일에 직접 액세스하거나 OS와 대화하는 실제 방법이 없습니다. 다시 말하지만, 이것을 제공하는 어떤 종류의 방법이 있어야 할 것입니다. 아, 그리고 그 모든 소리 처리? GPU는 소리를 내지 않습니다. 그래서 그것들은 CPU로 돌아가서 사운드 칩으로 나가야합니다.

아, 그리고 GPU 코딩은 끔찍합니다. 제대로하기가 어렵고, 한 GPU 아키텍처에 "올바른" 것은 다른 것에 매우 잘못 될 수 있습니다 . 그리고 그것은 단지 AMD에서 NVIDIA로 전환하는 것만이 아닙니다. GeForce 250에서 GeForce 450으로 전환 할 수 있습니다. 기본 아키텍처의 변화입니다. 그리고 쉽게 코드가 제대로 실행되지 않을 수 있습니다. C ++ 및 C조차도 허용되지 않습니다. 당신이 얻는 가장 좋은 것은 OpenCL입니다 .C와 비슷하지만 멋진 점은 없습니다. 재귀 처럼 . 맞습니다 : GPU에 재귀가 없습니다.

디버깅? 오하이오 드 IDE의 디버깅 기능이 마음에 들지 않기를 바랍니다. GDB를 사용하더라도 작별 인사를하십시오. printf디버깅 에 의지해야합니다 ... 기다립니다 printf.GPU는 없습니다 . 따라서 메모리 위치에 쓰고 CPU 스텁 프로그램에서 다시 읽도록해야합니다.

맞습니다 : 수동 디버깅. 좋은 결과 내길 바랄 게.

또한 C / C ++에서 사용하는 유용한 라이브러리는 무엇입니까? 또는 XNA 등을 사용하는 .NET 사용자 일 수도 있습니다. 또는 무엇이든. 당신이 사용할 수 없기 때문에 그것은 중요하지 않습니다 어떤 GPU에서 그들 중입니다. 처음부터 모든 것을 코딩해야합니다. 그리고 이미 존재하는 코드베이스가 있다면 모든 코드를 다시 작성할 시간입니다.

그래 복잡한 게임에서는 실제로 끔찍한 일입니다. 그리고 게임이 도움이 될만큼 평행하지 않기 때문에 작동하지 않을 것입니다.


21

대답하기가 쉽지 않은 이유 -GPU는 일반 CPU처럼 일반 용도로 사용되지 않는 특수 프로세서라는 점에 유의해야합니다. 이 전문화로 인해 GPU가 특별히 설계되고 최적화 된 것보다 CPU를 능가하는 것은 놀라운 일이 아니지만 반드시 일반화 된 CPU의 전체 기능과 성능을 대체 할 수있는 것은 아닙니다.

개발자가 다음과 같은 다양한 이유로이 작업을 수행하지 않는 것 같습니다.

  • 그들은 그래픽이 가능한 최고 품질의 품질을 원하며 귀중한 GPU 리소스를 사용하면이를 방해 할 수 있습니다.

  • GPU 특정 코드를 작성해야 할 수도 있으며, 이로 인해 현재 게임 (또는 응용 프로그램)의 전체 프로그래밍에 추가적인 복잡성이 발생할 수 있습니다.

  • GPU는 일반적으로 네트워크 카드, 키보드, 마우스 및 조이스틱과 같은 리소스에 액세스 할 수 없으므로 게임의 모든 측면을 처리 할 수 ​​없습니다.

귀하의 질문의 두 번째 부분에 대한 답변으로 그렇습니다. 다른 용도가 있습니다. 예를 들어 SETI @ Home (및 아마도 다른 BOINC 프로젝트)과 같은 프로젝트는 고속 복합 계산에 GPU (예 : nVidia의 프로젝트)를 사용하고 있습니다.

  NVIDIA GPU에서 SETI @ home을 실행
  하십시오. http://setiathome.berkeley.edu/cuda.php

( 나는 흥미로운 아이디어를 제시하기 때문에 귀하의 질문을 좋아합니다. )


18

CPU는보다 유연하며 일반적으로 프로그래밍하기가 더 쉽고 단일 스레드를 훨씬 빠르게 실행할 수 있습니다.

최신 GPU는 거의 모든 작업을 해결하도록 프로그래밍 할 수 있지만 병렬 아키텍처를 활용할 수있을 때 속도 이점 만 얻습니다. 이는 일반적으로 반복성이 높은 "간단한"작업의 경우입니다. 우리가 작성하는 많은 코드는 GPU에서 효율적으로 실행하기에 너무 예측하기 어렵습니다.

무엇보다도 다양한 그래픽 칩의 코드를 최적화하는 데 많은 시간을 소비 할 수 있습니다. OpenCL을 사용하여 동일한 코드를 다양한 그래픽 칩에서 실행할 수 있지만이 사치품의 속도 이점 중 일부를 거래하게됩니다.

게임 프로그래머의 관점에서 볼 때 우리는 일반적으로 게임이 그래픽 카드가 적은 컴퓨터에서 실행되기를 원합니다. 통합 칩 중 일부는 필요한 프로그래밍 기능이 없지만 칩이 너무 느리면 프로세서 속도가 너무 뛰어나서 작업을 잘 수행해야하는 경우에도 프로세서를 크게 이길 수 없습니다. 물론 게임을 위해 로우 엔드 GPU를 활용했다면 그래픽 렌더링에서 매우 필요한 처리 능력을 얻게 될 것입니다.

실제로 전망은 훌륭하지만 암호를 해독하는 대신 게임을 만들 때 실제적인 문제는 대부분의 이점보다 큽니다.


6

GPU는 프로그래밍하기가 매우 어렵습니다. GPU에서 목록을 정렬하는 방법을 검색해야합니다 . 많은 논문들이 그것을 찾아왔다.

하나의 스레드로 CPU를 사용하는 것은 쉽고 다중 스레드를 사용하는 것이 더 어렵고 병렬 라이브러리가있는 많은 컴퓨터를 PVM 또는 MPI로 사용하고 GPU를 사용하는 것이 가장 어렵습니다.


4

보다 다른 Randolf 리처드슨 대답 GPU 프로세서가 스스로 처리 할 수있는 몇 가지 특정 기능이 있습니다. 예를 들어, 그래픽 메모리 관리 명령 중 일부는 GPU가 처리 할 수 ​​없으므로 CPU에서 처리합니다.

그리고 또 다른 큰 이유가 있습니다. GPU는 다중 스레드 계산을 위해 설계되었습니다. 즉, GPU 제조업체는 컴퓨팅 성능을 높이고 싶을 때마다 코어를 쉽게 추가 할 수 있습니다. 그러나 피보나치 시리즈 에서 n 번째 숫자 계산과 같은 작은 문제로 나눌 수없는 많은 작업이 있습니다 . 이러한 상황에서 CPU는 단일 스레드 작업에 더 최적화되어 있기 때문에 훨씬 빠릅니다.


4

GPU가 작업을 병렬로 처리하기 때문에 GPU가 더 빠르다는 제안이 많이 있습니다. 이것은 문제를 조금 과장하고 있습니다. GPU는 더 제한적인 메모리 액세스가 가능하고, 많은 데이터 유형을 지원할 필요가없고, 더 효율적인 명령어 세트를 가질 수있는 등의 다른 이유로 인해 더 효율적일 수 있습니다. 초기 GPU는 여전히 1 픽셀 만 그릴 수있었습니다. 한 번에, 그들이 중요한 모든주기마다 1을 할 수 있다는 사실이었습니다.

그들이 작업의 서로 다른 범주에 잘 수행하도록 사용자 정의하는 기계의 2 개의 다른 종류이기 때문에 실제 차이는 보이지 비슷하지만 실제로는 매우 다르다가. 비행기를 자동차와 비교하는 것과 같습니다. 비행기의 최고 속도는 훨씬 높지만 사용 방법에 대한 제한이 더 많습니다. 어떤 종류의 여행 으로든 같은 여행을 할 수있는 경우에는 비행기가 우월 해 보입니다.


비행기에 대한 비유는 매우 좋은 것 (+1)이지만 CPU가 (적어도 인텔 공간에서는) 상위권 언어 개념에 더 가까운 다른 데이터 유형을 지원하는 CPU와 관련하여 매우 기본적인 형태의 데이터 (예 : 비트, 바이트, 워드, 드 워드 등). 0 바이트로 끝나는 데이터를 스캔하거나 복사하는 타이트 루프 명령어가 있지만 이러한 인스턴스의 데이터는 실제로 CPU에서 특정 유형으로 인식되지 않습니다 (0으로 끝나는 데이터 덩어리 이외) 이 루프의 맥락에서).
랜돌프 리차드슨

@Randolf : CPU는 서로 다른 저수준 데이터 유형 (예 : 부호 vs. 부호 없음, 정수 vs. 부동 소수점)을 처리하는 명령어와 레지스터가 다릅니다. 이것은 8086과 실제로 가장 현대적인 아키텍처의 경우이며 완전히 무료로 제공되지는 않습니다.
Kylotan

기본 아키텍처에서 여전히 많은 선형 처리를 수행한다고 확신합니다. 프로그래밍 측면에서 GPU에 대한 지시가 필요하지만 코어는 다른 하드웨어에 대한 의존성 때문에 메모리에서 읽는 것과 같이 병렬 적이 지 않기 때문에 정확히 병렬로 실행되지 않습니다. 아마도 GPU는 데이터를 단일 코어에 제공 할 수 있습니다. 시간.
Pablo Ariel

3

개발자 자신이 사용하는 모든 기능에 GPU를 사용합니다. 그들은 모든 기능에 CPU를 사용합니다. 그들이 왜 그렇지 않다고 생각합니까?

GPU는 대량으로 병렬화 할 수있는 작업에 적합하며 적은 메모리 요구 사항이나 적은 양의 의사 결정으로 높은 시간적 상관 관계로 대량의 계산이 필요합니다. 여기에는 이미지 렌더링, 물리 시뮬레이션 (입자, 충돌, 옷감, 물, 반사) 등이 포함됩니다. 이것이 바로 현대 게임이 GPU를 사용하는 것입니다.

CPU는 병렬화가 잘되지 않고 대량의 의사 결정이 필요한 작업에 적합합니다. 중간 정도의 시간 상관만으로도 높은 메모리 요구 사항을 견딜 수 있습니다. 여기에는 인공 지능, 사용자 인터페이스, 디스크 및 네트워크 I / O 등이 포함됩니다. 이것이 바로 현대 게임이 CPU를 사용하는 것입니다.


1

리드 백은 때때로 CPU를 선호한다고 생각할 수있는 또 다른 이유입니다. 대역폭 측면에서 (GPU-> CPU 대역폭이 최신 하드웨어에서는 그다지 문제가되지 않기 때문에) 파이프 라인을 정지시키는 측면에서. 계산에서 결과를 가져 와서 흥미롭고 유용한 작업을 수행 해야하는 경우 GPU를 사용하는 것이 현명한 선택이 아닙니다 (일반적인 경우-적절한 경우 특별한 경우가 있습니다). GPU에서 수행중인 작업을 중지하고 보류중인 모든 명령을 플러시하고 리드 백이 완료 될 때까지 기다립니다. 이것은 GPU 사용의 이점을 없앨뿐만 아니라 실제로는 상당히 느려질 정도로 성능을 저하시킬 수 있습니다.


0

이것은 오래된 글이지만 최근에 출판 된이 논문은이 질문에 대답 할 수 있습니다. ACM Computing Surveys 2015에 발표 된이 백서는 각 CPU와 GPU가 고유 한 장점을 가지고 있으므로 "CPU 대 GPU 토론"에서 "CPU-GPU 협업 컴퓨팅"패러다임으로 이동하는 사례를 제시합니다.

CPU-GPU 이기종 컴퓨팅 기술 조사

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.