지금까지 나는 그래픽 파이프 라인의 다양한 단계를 구현하는 매우 전문적인 일행에서보다 일반적인 접근 방식으로 이동했다는 것을 알 수있었습니다. 이 변환은 프로그래밍 가능한 셰이더 형태로 3D API에 부분적으로 반영되었습니다. 대부분의 트랜지스터는 실제 셰이더 명령을 실행하는 대규모 병렬 SIMD 장치 전용입니다.
옳은. 기본적으로 구형 GPU에서는 비교적 큰 피처 크기로 인해 기본 조명, 앤티 앨리어싱, 텍스처 매핑, 지오메트리 등을 효율적으로 구현하는 유일한 방법은 "고정 함수"파이프 라인을 사용하는 것입니다. 현재 GPU와 같이보다 일반적인 대규모 병렬 SIMD 아키텍처를 사용하여 구현할 수있는 충분한 칩 밀도가 없기 때문에 성능 향상을 위해 유연성을 희생했습니다.
최신 GPU (Nvidia Fermi라고 생각)는 기본적으로 CPU 및 다양한 캐시의 명령 및 데이터가 제공되는 "스튜디오"SIMD 배열이며 그래픽 파이프 라인을 해당 명령에 매핑하는 모든 실제 논리는 그래픽 드라이버에서 발생합니다. ?
어떤 일들은 여전히 하드웨어에서 이루어집니다. 다른 사람은 그렇지 않습니다. 예를 들어, ROP 는 여전히 최종 단계에서 픽셀 데이터를 VGA 칩셋으로 푸시하는 데 사용됩니다. 참고 여기서 "VGA 칩셋"을 일반적인 용어로 사용하여 비디오 신호가 실제로 "VGA"인지 여부에 관계없이 모니터에 비디오 신호를 전송하는 메커니즘을 나타냅니다.
일반적으로 엔비디아 페르미 (Nvidia Fermi) 및 AMD 서던 아일랜드 (Southern Southern Islands)와 같은 현재의 GPU 아키텍처는 대부분 맞춤형 명령 세트가있는 대규모 병렬 CPU이며 각 개별 "코어"는 매우 약하지만 실제로는 전체 코어의 많은 (때로는 수천). 그러나 여전히 그래픽 관련 하드웨어가 있습니다.
하드웨어 비디오 디코딩은 대개 고정 기능 칩을 사용하여 수행됩니다. DRM (Digital Restrictions Management)이 관련된 경우에 특히 그렇습니다. 때때로 "하드웨어"비디오 디코딩은 실제로 SIMD 코어에 대한 일반적인 오래된 작업으로 제공되는 펌웨어 안내 명령 세트를 의미합니다. 정말 달려 있습니다.
컴퓨팅 전용 Nvidia 보드 (Tesla)가 거의 없다는 점을 제외하면 거의 모든 "일반 SIMD" 그래픽 카드 에는 비디오 출력 전용 하드웨어가 있습니다. 비디오 출력은 렌더링과 다릅니다. 고정 기능 출력 요소에는 HDMI가 오디오를 지원하기 때문에 LVDS / TMDS / HDMI / DisplayPort 코덱, HDCP 및 심지어 오디오 처리 (기본적으로 작은 DSP)가 포함됩니다.
"그래픽 메모리"는 여전히 GPU와 온보드로 저장되므로 시스템 RAM에 도달하기 위해 수다스럽고 대기 시간이 짧은 PCIe 버스를 통과 할 필요가 없습니다. 용량이 작지만 시스템 메모리보다 빠른 속도로 제공되는 고품질, 빠른 그래픽 메모리 (예 : GDDR5). 그래픽 메모리에 물건을 저장하고 그곳에서 GPU 또는 CPU로 검색하는 과정은 여전히 고정 기능 작업입니다. 일부 GPU에는 자체 "IOMMU"종류가 있지만이 메모리 관리 장치는 CPU와 다릅니다 (별도). 그러나 메모리 아키텍처가 거의 "일관성있는"프로세서 (Sandy 및 Ivy Bridge)에 통합 된 최신 인텔 GPU의 경우에는 사실이 아닙니다. 시스템 메모리) 및 그래픽 메모리의 읽기는 GPU에 비해 CPU에 비해 저렴합니다.
또는 들어오는 고급 명령 및 데이터 스트림 (컴파일 된 쉐이더 프로그램, 정점 데이터 및 속성 및 텍스처)을 실제 SIMD 명령으로 변환하고 동기화, 메모리 할당 등을 처리하는 GPU 어딘가에 제어 장치가 있습니까?
SIMD의 "기본"언어는 거의 항상 GPU 자체 펌웨어가 아니라 소프트웨어 드라이버에서 생성됩니다. 이것은 DirectX 9 / OpenGL 2.x 레벨 기능에 특히 해당됩니다. HLSL, GLSL 또는 OpenGL ARB 쉐이더 어셈블러와 같은 고급 언어로 작성된 셰이더는 결국 특정 레지스터를 뱅킹하고 필요한 PCIe 후프를 수행하여 컴퓨팅 및 / 또는 렌더링의 배치 버퍼를 통해 전송함으로써 드라이버에 의해 GPU 명령으로 변환됩니다. 명령.
하드웨어 테셀레이션 (DirectX 11 / OpenGL 4.0)과 같은 몇 가지 사항은 예전의 거의 모든 작업을 수행했던 방식과 마찬가지로 고정 기능 방식으로 하드웨어에 다시 적용됩니다. 다시 말해, 성능 제약으로 인해 이러한 계산을 수행하는 가장 효율적인 방법은 펌웨어 나 드라이버가 SIMD를 "프로그램"하도록하는 대신 전용 회로를 갖추는 것입니다.
나는 현실이 그 두 극단 사이에 있다고 생각하고 대답은 다소 길고 많은 추측에 근거 할 것입니다 (특정 GPU 공급 업체가 드라이버는 물론 제품에 대한 문서 게시를 거부하는 이유가 있어야합니다) 소스 코드 ...), 그러나 올바른 방향과 유용한 리소스에 대한 힌트는 크게 감사하겠습니다.
AMD와 인텔은 최신 GPU에 대한 공개 문서와 Linux 용으로 완벽하게 작동하는 오픈 소스 그래픽 드라이버를 매우 강력하게 문서화했습니다 (Mesa 및 Direct Rendering Manager 프로젝트 참조). 이 드라이버에서 일부 코드를 살펴보면 그래픽 드라이버 작성자가 실제로 "소프트웨어"에서 다양한 모양이나 패턴을 그리는 것과 같은 지오메트리 를 구현 해야하기 때문에 웃을 것입니다. GPU 펌웨어와 고정 기능이 더 이상 하드웨어에서 완전히 처리하기 위해 더 이상 존재하지 않기 때문에 하드웨어에 대한 레거시) :) 새로운 기능에서 OpenGL 1.x / 2.x를 지원하기 위해해야 할 일이 재미 있습니다. 하드웨어.
진화는 다음과 같이 진행되었습니다.
- 아주 오래 전 (실시간 3D 렌더링이 가능하기 전에) : CPU에서의 레이트 레이싱은 비 실시간 렌더링에 일반적이었습니다. 초기 버전의 Windows에서 볼 수 있듯이 간단한 그래픽의 경우 CPU는 고정 기능 하드웨어없이 간단한 모양 (사각형, 글꼴 문자, 음영 패턴 등)을 그릴 수있을 정도로 빠르지 만 너무 복잡한 것을 그릴 수는 없습니다.
- 오래 전 (OpenGL 1.x) : 솔리드 스테이트 하드웨어로 구현 된 거의 모든 것; "전기적으로"고정 된 기능은 기본 작업에서도 표준이었습니다.
- 얼마 전 (OpenGL 2.x) : GPU를 더 프로그래밍 가능하게 만드는 전환이 시작되었습니다. 5 년 된 하드웨어의 "Fragment shader"(일명 픽셀 쉐이더)는 거의 CPU와 같은 임의의 계산을 수행 할 수 있지만 여전히 그래픽에 맞춰진 아키텍처에 의해 제한됩니다. 따라서이 하드웨어에서는 OpenCL / DirectCompute를 사용할 수 없습니다.
- 최근 (OpenGL 3.x) : 범용 GPU 로의 전환은 대부분 완료되었지만 물론 효율적으로 작동 할 수있는 CPU가 아닌 대량의 데이터 매트릭스 (선형 대수)가 배치로 제출되는 워크로드에 최적화되어 있습니다. 매우 작은 데이터의 긴 시퀀스 (1 + 1, 2 * 4, 5 * 6 시퀀스 등) 범용 컴퓨팅은 OpenCL, CUDA 등을 통해 사용할 수 있지만 하드웨어는 여전히 완전한 SISI 보조 프로세서가 아닙니다. (a) GPU 기능을 사용하려면 하드웨어 특정 레지스터를 망치어야합니다. (b) PCIe 버스 오버 헤드로 인해 GPU VRAM에서 읽기 속도가 매우 느립니다 (GPU에서 읽기는 현재 아키텍처에서 최적화되지 않았습니다). (c) 메모리 및 캐시 아키텍처는 CPU와 일관성이 없다. 많은 레거시 고정 기능 하드웨어가 여전히 놓여 있습니다.
- 현재 (OpenGL 4.x) : 많은 레거시 고정 기능 하드웨어를 제거했습니다. GPU 읽기 대기 시간이 다소 향상되었습니다. IOMMU를 사용하면 VRAM과 시스템 메모리간에 (번역 된) 하드웨어 지원 매핑이 가능합니다. 또한 고정 기능 요소를 가져 오는 하드웨어 테셀레이션을 도입했습니다.
- 미래 ( HSA) : GPU는 기본적으로 보조 프로세서입니다. PCIe 버스의 전용 GPU 인 경우에도 GPU와 CPU간에 임피던스 (읽기 / 쓰기 용)가 거의없는 CPU와 완전히 통합되어 있습니다. 완전히 일관된 메모리 아키텍처- "mi memoria es su memoria"(내 기억은 당신의 기억입니다). 사용자 공간 프로그램은 드라이버 심이없는 시스템 메모리에서 읽는 것처럼 "VRAM"에서 읽을 수 있으며 하드웨어가이를 관리합니다. 적당한 양의 데이터에 대해서는 "직렬"처리 용 CPU (이 작업을 수행 한 다음이 작업을 수행 한 다음 수행함)와 "병렬"처리 용 GPU를 사용합니다 (이 거대한 데이터 세트에서이 작업을 수행하여 분할) 당신이 맞는 볼 방법). GPU가 장착 된 보드에는 여전히 ROP, HDMI 코덱 등이있을 수 있지만이 출력은 디스플레이 출력에 필요합니다.