CPU에서 수행되는 계산과 GPU에서 수행되는 계산을 어떻게 제어합니까?


14

내 현재 이해는 셰이더 파일에서 수행되는 모든 작업이 GPU에서 수행되고 내 (Java의 경우) 코드에서 수행 된 모든 작업이 CPU에서 수행된다는 것입니다.

이것이 정확한 설명입니까?


2
또한 OpenCL 과 같은 것을 사용하여 GPU에서 컴퓨팅을 수행 할 수 있으며 본질적으로 GPU에서 코드를 실행할 수 있습니다.
Soapy

답변:


20

그것이 요점입니다.

원칙적으로 플랫폼은 원하는대로 수행 할 수 있습니다. x86에서 GPU 코드로 컴파일 된 코드를 적시에 변환하는 고급 운영 체제를 상상할 수 있습니다. 마찬가지로 OpenGL 드라이버는 호스트 CPU에서 원하는 것을 실행할 수 있습니다.

그러나 실제로, 당신이 방금 설명한 것은 일어나는 일입니다.


5
IIRC, 쉐이더는 GPU로 전송되기 전에 CPU에서 컴파일 됩니다. 그리고 그것은 OS없이 GPU 드라이버에 의해 수행됩니다.
MSalters

진실. 자바 코드가 이미 컴파일 된 경우에도 셰이더에서 프로그램을 실행하는 동안 많은 컴파일 오류를 처리했습니다.
Bassinator 2016 년

1
이론적 : CPU를 많이 사용하지만 명령 행 인터페이스 (그래픽 작업 없음) 인 프로그램이 있다고 가정 해 보겠습니다. 일부 작업을 GPU로 오프로드 할 수 있습니까? 나는 실제로 이것을 할 계획이 아니며, 그것은 단지 관심있는 개념적 일입니다.
Bassinator

2
예! @return true가 게시 한 링크는이를 수행하는 Java 라이브러리 용입니다. 보다 일반적으로 OpenGL에서 "컴퓨 트 셰이더"를 작성하거나 OpenCL을 사용할 수 있습니다. 모든 경우에 병렬화 할 수있는 코드의 일부를 분리하고 정보를주고받습니다. (GPU는 "쩔쩔 매게 병렬"작업의 대부분은 중대하다.)
데이비드 밴 직전

1
이 답변에 추가하는 한 가지 별표는 일부 구현이 "프리 쉐이더"라는 아이디어를 지원한다는 것입니다. 즉, 셰이더의 일부이지만 코드는 일정한 그리기 호출에서 균일 한 뷰를 곱하는 등 모든 호출에서 일정하게 유지됩니다 & 투영 행렬). 기울어 진 쉐이더 컴파일러는 이와 같은 코드 비트를 식별하여 GPU에 제출 된 작업의 결과로 일정한 출력을 포함하여 CPU 측에서 한 번 실행되도록 끌어 올릴 수 있습니다. "쉐이더 = GPU"가정이 세부적으로 만 구부러지는 일반적인 경우입니다.
DMGregory

7

일반적으로 그렇습니다. Java는 CPU에서 실행되는 프로그램을 작성하는 데 사용됩니다. 셰이더 언어 (cg, hlsl 등)는 GPU에서 실행되는 프로그램을 작성하는 데 사용됩니다.

규칙에 대한 예외 는 격차를 해소 할 수있는 타사 API 를 사용하는 것 입니다.


1
매우 흥미로운 팁, "aparapi"링크. GPU에서 JVM 코드를 실행하십시오 ... 흥미로운!
david van brink

3

david van brink는 귀하의 질문에 일반적으로 답변했습니다.

그러나 그가 말했듯이 OpenGL 드라이버는 CPU에서 무언가를 실행할 수 있으며 실제로 많은 일이 발생합니다. 특히 호환성 컨텍스트에서 일부 이상한 레거시 기능을 그래픽 카드에서 구현할 수 없습니다. 소프트웨어 에뮬레이션이 필요합니다. 예를 들어, CPU에서 stippling이 실행되기 전에 들었습니다. 피킹으로 놀라움을 기대할 수도 있습니다.
애플은 2.1G 컨텍스트를 사용하는 맥 OS에서 훨씬 더 많은 일을 할 수있다. 애플은 하드웨어 범위에 비해 OpenGL에 대한 관점을 상당히 통일하고 있으며 일부 작은 하드웨어에는 에뮬레이션해야 할 부분이 없기 때문이다. 컨텍스트 생성 코드가 소프트웨어 장치를 명시 적으로 지정하는 경우 실제로 CPU에서 ENTIRE OpenGL 2.1 사양을 완전히 실행할 수 있습니다.

반대로 vexcl 또는 boost compute와 같은 컴퓨팅 라이브러리 또는 Microsoft의 AMP 또는 nVidia thrust와 같은 컴퓨팅 라이브러리를 통해 실행되는 코드는 API 설정 플래그에 따라 GPU 또는 CPU에서 실행될 수 있습니다.

그리고 마무리 터치를 위해 CPU 내부에는 SIMD라고 불리는 DSP 아키텍처도 있습니다. 인텔의 ispc 컴파일러는 컴파일 시간에 많은 성능 진단을 통해 SIMD 레인에서 실행되도록 "확장 된"코드를 생성하여 최대한 활용할 수 있도록 도와줍니다. 그것에 OpenMP를 추가하면 GPU 개념에 접근하는 멀티 스레드 SIMD를 얻을 수 있습니다. 하이 엔드 CPU 및 로우 엔드 GPU가있는 경우 실제로 성능이 더 우수 할 수 있습니다.
http://ispc.github.io/

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