CPU 대신 GPU로 작업을 언제 오프로드해야합니까?


15

OpenCL 과 같은 최신 시스템 은 그래픽 프로세서에서 점점 더 많은 코드를 실행할 수 있도록 만들어졌습니다. 가능한 한 시스템의 많은 기능을 활용할 수 있어야하기 때문입니다.

그러나 이러한 모든 새로운 시스템에서는 마치 GPU가 모든면 에서 CPU보다 나은 것처럼 보입니다 . GPU는 병렬 계산을 수행 할 수 있기 때문에 멀티 코어 GPU는 실제로 멀티 코어 CPU보다 훨씬 나은 것처럼 보입니다. 한 번에 많은 계산을 수행하고 실제로 속도를 향상시킬 수 있습니다. 직렬 처리가 병렬보다 여전히 더 좋고 빠르며 효율적인 경우가 있습니까?



6
실제로 하드웨어에 대한 질문은 아닙니다. "GPU를 프로그래밍하는 것보다 CPU를 더 잘 프로그래밍 할 때"라는 말을 다시 써야합니다. 이는 꽤 좋은 p.se 질문 IMO입니다. SO에서 GPGPU 태그를 참조하십시오. 그러나 아키텍처 "어떤 기술을 사용해야 하는가"라는 질문이 여기보다 낫습니다.
Kate Gregory

1
@Kate 그 각도는 연결된 수퍼 유저 질문에서 잘 다루는 것 같습니다. 그것을 통해, 나는 정직하기 위해 여기로 이주하지 않았다는 것에 약간 놀랐습니다. 도 있는데 SO에. 나는 질문을 다시 열 것입니다 (당신이 옳기 때문에 프로그래밍 측면이 여기에 주제입니다). 이 문제에 대한 기존 (우수한) 적용 범위를 가리키는 것이 아니라고 생각합니다.
Adam Lear

1
@Anna의 견해에 따르면, 프로그래머가 GPU와 CPU의 차이점에 대한 순수한 이론적 논의보다는 GPU를 사용해야 할 때에 대한 답변이 훨씬 더 필요하다고 생각합니다. 이것을 반영하여 제목을 편집했습니다.

2
@RetroX 질문이 다른 사이트에있는 경우 중복 질문으로 마감 할 수 없습니다.
Adam Lear

답변:


26

그러나 이러한 모든 새로운 시스템에서 GPU는 모든면에서 CPU보다 나은 것처럼 보입니다.

이것은 근본적인 오해입니다. 현재 GPU 코어는 현재 최상위 CPU에 비해 ​​여전히 제한되어 있습니다. NVIDIA의 Fermi 아키텍처는 현재 가장 강력한 GPU라고 생각합니다. 정수 산술을위한 32 비트 레지스터 만 있으며, 현재 상용 인텔 프로세서보다 분기 예측 및 추론 실행 기능이 적습니다. Intel i7 칩은 3 가지 수준의 캐싱을 제공하고 Fermi 코어에는 2 개만 있으며 Fermi의 각 캐시는 i7의 해당 캐시보다 작습니다. GPU 코어 간의 프로세스 간 통신은 상당히 제한되어 있으며, 이러한 제한을 수용하기 위해 계산을 구성해야합니다 (코어가 블록으로 구성되어 있으며 블록의 코어 간 통신은 비교적 빠르지 만 블록 간의 통신은 느립니다).

현재 GPU의 중요한 제한 사항은 코어가 모두 동일한 코드를 실행해야한다는 것입니다. CPU의 코어와 달리 하나의 GPU 코어는 이메일 클라이언트를 실행하고 다른 코어는 웹 서버를 실행하도록 지시 할 수 없습니다. GPU에 행렬을 반전시키는 기능을 제공하면 모든 코어가 다른 비트의 데이터에서 해당 기능을 실행합니다.

GPU의 프로세서는 고립 된 세상에 살고 있습니다. 디스플레이를 제어 할 수 있지만 디스크, 네트워크 또는 키보드에는 액세스 할 수 없습니다.

GPU 시스템에 액세스하려면 상당한 오버 헤드 비용이 발생합니다. GPU에는 자체 메모리가 있으므로 계산은 GPU 카드의 메모리 용량으로 제한됩니다. GPU 메모리와 주 메모리간에 데이터를 전송하는 것은 상대적으로 비쌉니다. 실제로 이것은 설정 및 해제 비용으로 인해 계산에 필요한 시간이 많이 걸리기 때문에 CPU에서 GPU로 몇 가지 간단한 계산을 수행 할 경우 아무런 이점이 없습니다.

결론적으로 GPU는 병렬로 계산할 수있는 긴 계산 사본이 수백 또는 수천 개있을 때 유용합니다. 일반적인 작업으로는 과학 컴퓨팅, 비디오 인코딩 및 이미지 렌더링이 있습니다. 텍스트 편집기와 같은 응용 프로그램의 경우 GPU가 유용한 유일한 기능은 화면에 유형을 렌더링하는 것입니다.


배정도 지원은 Shader Model 5의 일부이며 AMD / ATI도 지원합니다.
벤 Voigt

@ 벤, 정정 주셔서 감사합니다. 잘못된 진술을 삭제했습니다.
Charles E. Grant

11

GPU는 CPU와 같은 일반적인 프로세서가 아닙니다. 그들은 동일한 코드를 많은 양의 데이터에 적용하는 하나의 매우 구체적인 일을 전문으로하며 CPU보다 훨씬 잘 수행합니다. 그러나 대부분의 응용 프로그램은 대부분 동일한 데이터를 대량의 데이터에 적용하는 것이 아닙니다. 이벤트 루프에 관한 것입니다 : 입력 대기, 입력 읽기, 작동 및 추가 입력 대기. 그것은 일련의 과정이며 GPU는 "직렬"에 빠집니다.

처리해야 할 대량의 데이터가 있고 각 항목을 다른 항목과 독립적으로 병렬로 처리 한 다음 GPU로 전송하십시오. 그러나 이것을 모든 것을 짜야하는 "새로운 패러다임"으로 생각하지 마십시오.

이 질문에는 "최적화"라는 태그가 붙어 있으므로이를 하나로 취급해야합니다. 테스트 및 프로파일 링에서 최적화가 필요하고 작업의 특성이 GPU 최적화를 적용 할 수있는 것으로 나타나면 GPU 최적화를 적용하십시오. 그렇지 않으면 조기 최적화 또는 잘못된 최적화로 인해 수정보다 더 많은 문제가 발생하므로 신경 쓰지 마십시오.


8

간단한 대답은 매우 많은 수의 각 항목에 대해 상당히 작고 매우 간단한 계산을 수행해야 할 때 GPU가 가장 잘 작동한다는 것입니다. 이 방법을 많이 사용하려면 각 항목의 계산이 다른 항목의 계산과 독립적이어야합니다. 한 항목과 다른 항목 사이에 (일반적으로) 약간의 종속성이있는 경우 일반적으로 GPU에서 해당 코드를 실행하는 데 많은 도움이되기 전에이를 깨는 방법을 찾아야합니다. 종속성을 전혀 깰 수 없거나 깨는 데 너무 많은 작업이 필요한 경우 코드가 CPU에서 더 빠르게 실행될 수 있습니다.

대부분의 현재 CPU는 현재 GPU가 전혀 지원하지 않는 몇 가지 유형의 작업 (예 : 멀티 태스킹을위한 메모리 보호)도 지원합니다.

약간 다른 방향에서 보았을 때, CPU는 프로그래머에게 합리적으로 편리하도록 (대부분) 설계되었으며, 사람들은 편리한 모델을 유지하는 하드웨어를 만들기 위해 최선을 다한 하드웨어를 만들었습니다. 프로그래머이지만 가능한 한 빨리 실행됩니다.

GPU는 반대 방향에서 나옵니다. 주로 하드웨어 설계자에게 편리하도록 설계되었으며 OpenCL과 같은 하드웨어는 하드웨어의 제약 조건에서 가능한 한 합리적인 프로그래밍 모델을 제공하려고 시도했습니다.

GPU에서 실행할 코드를 작성하는 것은 일반적으로 CPU에서 동일한 작업을 수행하는 것보다 시간과 노력이 많이 들기 때문에 비용이 더 많이 듭니다. 따라서 다음과 같은 경우에 주로 수행하는 것이 좋습니다.

  1. 최소한의 노력으로 큰 이익을 기대할 수 있도록 문제가 너무 평행하거나
  2. 속도 이득은 매우 중요하므로 많은 추가 작업이 필요합니다.

이 각각에 대한 몇 가지 분명한 가능성이 있습니다 -하지만 거대한 애플리케이션의 수는 분명 근처에도 하나 하나 없습니다. 예를 들어 언제든지 GPU에서 실행되는 CRUD 응용 프로그램을 보게되어 매우 놀랄 것입니다. 그렇다면 아마도 누군가가 그 정확한 목표를 염두에두고 아마도 최적에 접근하는 것은 아닙니다. 비용 / 혜택 비율).

현실은 많은 ( "가장") 응용 프로그램의 경우 일반적인 CPU 속도가 훨씬 빠르며 프로그래밍 편의성 (새로운 기능을 쉽게 개발하는 것과 같은 것)이 훨씬 중요하다는 것입니다. 실행 속도.


3

한 번에 많은 계산을 수행하고 실제로 속도를 향상시킬 수 있습니다.

속도 향상? 그래서 무엇? 작년 내내 필요할 때 한두 번만 기억할 수 있습니다. 대부분의 경우 로직 수정 또는 수정, 다른 데이터 소스 조정, 사용자 상호 작용 등을 개선하라는 요청을 받았습니다. 고객이 관심을 갖는 유일한 속도 는 변경 속도였습니다. "한 달 안에 새로운 기능을 출시하십시오 – 2 주 후에 더 좋습니다".

내가 잘못하지 마십시오-코더로서 CPU 틱을 짜내는 것을 좋아합니다. 이 예술은 일반적으로 수요가 많지 않다는 것입니다.

직렬 처리가 병렬보다 여전히 더 좋고 빠르며 효율적인 경우가 있습니까?

나는 많은 경우가 있다고 말할 것입니다. 직렬 처리는 병렬보다 간단하므로 속도가 중요하지 않은 모든 경우에 더 효율적입니다. 직렬 처리를 통해 복잡한 논리 및 사용자 인터페이스를보다 쉽게 ​​구현할 수 있으며, 지정 및 테스트, 유지 관리 및 변경이 더 쉽습니다.

일반적으로 직렬 처리를 사용하면 프로그래머의 의도를보다 명확하게 표현하고 코드를 쉽게 읽을 수 있습니다. 나는 그것이 가장 귀중하고 부족한 자원-프로그래머의 두뇌를 구한다고 말하고 싶다.


2

CPU는 여전히 더 다양합니다. 예를 들어 GPU는 단 정밀도에서는 CPU보다 효율적이지만 배정 밀도는 아닙니다. GPU보다 CPU 라이브러리가 훨씬 더 많습니다.


3
좀 더 자세히 살펴볼 수 있습니까? 정확성에 대한 정보 나 설명없이 세 가지 진술을 제공했습니다.

효율적인 배정도 계산의 부족은 일반적인 지식입니다. en.wikipedia.org/wiki/GPGPU
quant_dev

@quant : 귀하의 정보는 2 년 이상 오래되었습니다. 544 GigaFLOPS 는 모든 주류 CPU보다 훨씬 빠릅니다.
벤 Voigt

@Ben 나는 귀하의 링크가 배정도 성능을 언급하는 곳을 보지 못했습니다.
quant_dev


2

간단한 규칙은, 당신이하고있는 일이 선형 대수학의 구문으로 표현 될 수 있고 시간이 중요하다면 GPU에서 그렇지 않으면 CPU를 사용한다는 것입니다.

GPU는 많은 CPU와 같지 않으며 성능 특성이 크게 다릅니다.


"시간이 중요한"경우 컴퓨팅 셰이더를 위해 GPU를 재구성하고 데이터를 업로드 할 시간이 없을 것입니다. 가장 큰 이점은 큰 문제입니다.
벤 Voigt

@Ben, 우리는 "시간 결정적"에 대한 다른 정의를 가지고 있다고 생각합니다. 즉, 계산은 상당한 시간 동안 임계 경로에 있다는 것입니다.
dan_waterworth

1

원시 숫자 처리가 필요한 경우 GPU를 사용하는 것이 좋습니다. 그러나 이러한 모든 ALU는 흐름 (분기) 회로를 제어하기위한 전용 트랜지스터가 적다는 것을 의미합니다. 따라서 많은 복잡한 제어 흐름, 많은 조건 등이 필요한 것을 작성해야하는 경우 CPU가 더 빠릅니다.

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