장치 드라이버 지침은 GPU를 어떻게 프로그래밍합니까?


9

컴퓨터, 일반적인 최신 컴퓨터를 어느 정도 사용한다고 가정 해보십시오. 장치 드라이버는 화면에 표시된 내용을 포함하여 화면에 표시되는 모든 내용을 담당합니다 (물론 Windows와 같은 OS 범위 내에 있음).

커널이 있는지 없는지 하드웨어가 신경 쓰지 않는 수준으로 낮추고 지시를 내립니다.

기본적으로 GPU는 모든 작업을 수행하는 방법을 정확히 "인식"하는 방법은 무엇입니까? 드라이버는 기본적으로 드라이버가 제공하는 특수 명령을 사용하여 표시 할 이진 데이터를 계산하는 데 필요한 모든 사소한, 내장형 또는 하드웨어 회로 수준 기능을 제어합니까?

그렇다면 GPU는 "특별한"언어 또는 "어셈블리"를 사용하여 CPU처럼 전송 된 명령을 이해합니까?

내 지식에 너무 많은 차이가 있으며 GPU 뒤에이 불쾌한 "수수께끼"가 있으며 하드웨어를 통해 직접 액세스합니다.

예를 들어, GPU와 CPU는 어떻게 든 연결될 수 있어야하므로 CPU 어셈블리를 통해 GPU에 액세스하고 올바른 데이터 / 주소 버스를 구현할 수 있습니다. 드라이버도 컴파일 된 코드이며, 프로그래머블 회로 인 GPU는 이진 명령어와 함께 작동해야하기 때문에 장치 공급 업체가 드라이버 외부에서 GPU에 액세스 할 수 없도록하는 방법은 없습니다.

이러한 유형의 질문을했는데 많은 사이트에서 왜 대답하지 않고 격렬하게 빠르게 삭제되었으므로 여기에 큰 미스터리 / 비밀은 무엇입니까? 다른 것과 마찬가지로 액세스되는 마더 보드의 하드웨어입니다.

소프트웨어와 하드웨어에 관한 "OK"질문이라고 가정하면, 파일이 마 법적이지 않기 때문에 벤더별 파일없이 누구나 GPU에 직접 액세스 할 수 있습니다.

그렇다면 하드웨어 별 수준에서 베어 메탈 직접 하드웨어 관점에서 GPU를 어떻게 "프로그래밍"합니까?


제 생각에는 "OK"질문입니다 (볼록하지만 책에 답해야 할 수도 있습니다. 좋은 형식이 아니므로 먼저 도움말 센터둘러보기 페이지에서 어떤 종류의 질문에 익숙해 지도록 참조하십시오) .
Doktoro Reichard

도움말 센터를 읽지 않습니다.

왜 그런지 물어봐도 될까요?
Doktoro Reichard

더 나은 시간을 숙고 할 수 있기 때문에 "OK"라는 질문을 해결하고 답하려고 노력하십시오.

그리고 내가 말했듯이, 이 질문 에 올바르게 대답하려면 아마도 책이 필요할 것입니다 ... 긴 대답은 일반적으로 좋은 대답이 아닙니다.
Doktoro Reichard

답변:


8

기본적으로 GPU는 모든 작업을 수행하는 방법을 정확히 "인식"하는 방법은 무엇입니까? 드라이버는 기본적으로 드라이버가 제공하는 특수 명령을 사용하여 표시 할 이진 데이터를 계산하는 데 필요한 모든 사소한, 내장형 또는 하드웨어 회로 수준 기능을 제어합니까?

아니요,이 장치에는 장치 기능의 모든 하드웨어 수준 측면을 제어하는 ​​자체 IC가 있으며, 장치 측면을 조정하고 사용할 수있는 고급 프로그래밍 인터페이스를 제공하는 중앙 프로세서와 인터페이스합니다. 장치에 대한 액세스, 읽기, 쓰기 및 제어

그렇다면 GPU는 "특별한"언어 또는 "어셈블리"를 사용하여 CPU처럼 전송 된 명령을 이해합니까?

예, 아니오 대부분의 장치와 마찬가지로 비디오 카드는 표준 을 사용 하여 문제를 단순화합니다. 그들은 VESA 와 같은 표준 을 사용하여 부트 타임 비디오와 같은 일반 기능 에 액세스 하거나 CUDA 를 사용하여 GPU 프로그래밍 기능에 액세스합니다. 또한 프로그램은 장치의 프로그래밍 설명서 (어댑터 웹 사이트에서 제공)와 함께 머신 코드 (종종 C를 어셈블러로 컴파일)를 사용하여 비표준 또는 장치 종속 함수에 직접 액세스 할 수 있습니다.

내 지식에 너무 많은 차이가 있으며 GPU 뒤에이 불쾌한 "수수께끼"가 있으며 하드웨어를 통해 직접 액세스합니다.

드라이버는 장치에 직접 액세스하므로 특별한 액세스 권한이 있습니다 (일반 사용자 수준 프로그램은 보안 및 안정성상의 이유로 Vista +에서 하드웨어에 직접 액세스 할 수 없음). 포트, DMA ( Direct Memory Access ) 및 메모리 매핑을 사용하여 장치에 액세스합니다 .

예를 들어, GPU와 CPU는 어떻게 든 연결될 수 있어야하므로 CPU 어셈블리를 통해 GPU에 액세스하고 올바른 데이터 / 주소 버스를 구현할 수 있습니다. 드라이버도 컴파일 된 코드이며, 프로그래머블 회로 인 GPU는 이진 명령어와 함께 작동해야하기 때문에 장치 공급 업체가 드라이버 외부에서 GPU에 액세스 할 수 없도록하는 방법은 없습니다.

드라이버는 메모리 매핑 포트 등에 액세스하여 일반 CPU 명령어로 장치를 읽고 쓸 수 있습니다. 이해하기 쉬운 예로, 주소 B8000의 "메모리"에 쓰면 텍스트 모드에서 문자를 화면에 표시 할 수 있습니다. 이 주소는 RAM이 아니고 비디오 카드의 메모리에 해당하는 것으로 매핑되었으므로 기록하면 화면에 기록됩니다. 마찬가지로, 당신은 당신이에 기록 할 문자 넣어 화면 tothe 쓸 수 AL, 레지스트리를 0x09AH등록하고 BIOS 인터럽트를 호출 0x10. 더 발전된 기능은 다르지 않습니다. 어댑터의 메모리를 읽고 쓰고, 칩에있는 함수를 호출하는 등 장치가 노출하고 문서화하는 모든 인터페이스를 사용하여 기타 등등을 수행 할 수 있습니다.

소프트웨어와 하드웨어에 관한 "OK"질문이라고 가정하면, 파일이 마 법적이지 않기 때문에 벤더별 파일없이 누구나 GPU에 직접 액세스 할 수 있습니다.

표준을 준수하지만 다른 모든 것 (예 : 고급 기능)을 준수하는 기능에 대해서만 제조업체의 프로그래밍 문서를 참조해야합니다.

그렇다면 하드웨어 별 수준에서 베어 메탈 직접 하드웨어 관점에서 GPU를 어떻게 "프로그래밍"합니까?

여러 레이어를 통해 :

  1. 트랜지스터 등의 고체 성분
  2. 저수준 ASIC
  3. 온보드 프로세서 및 칩셋
  4. 저수준 프로그래밍 인터페이스 (조립품)
  5. 고급 프로그래밍 인터페이스 (DirectX, OpenGL)
  6. 고급 프로그래밍 언어 (C ++, C #, Python 등)

1
'베어 메탈'에 대한 참고 사항; 대부분의 게임 개발자가 이야기하는 것을 듣는 경우 카드 자체 기계 언어로 컴파일되는 코드를 작성하는 대신 DirectX / OpenGL과 같은 고급 추상화를 사용해야한다고 불평하고 있습니다. Nvidia의 FERMI GPU가 사용하는 어셈블러 랭게 그에 대한 정보는 여기를 참조하십시오 code.google.com/p/asfermi CUDA조차도 기계 코드로 컴파일되는 고급 랭귀지 (PTX) 꼭대기에 위치하므로 CUDA에서 프로그래밍하는 opcoode가 컴파일 된 출력과 같지 않습니다.
Frank Thomas

이 게시물에서 언급 한 내용을 다루는 대학생에게 적합한 도서 제안이 있습니까? GPU 프로그래밍 작업에 관심이 없지만 모든 작동 방식에 대한 이해의 차이는 실망 스럽습니다.
lanza

2

나는 컴퓨터 아키텍처의 천재는 아니지만 내가 아는 한도 내에서 귀하의 질문을 포인트별로 처리하려고 노력할 것입니다.


장치 드라이버는 화면에 표시된 내용을 포함하여 화면에 표시되는 모든 내용을 담당합니다 (물론 Windows와 같은 OS 범위 내에 있음).

주로 GPU와의 직접적인 상호 작용이 구현하기 쉽지 않기 때문에 사실입니다. 따라서 DirectX 및 OpenGL과 같은 그래픽 프레임 워크 개발.

Wikipedia 의이 편리한 정의 는이를 자세히 설명합니다.

장치 드라이버는 하드웨어 장치와이를 사용하는 응용 프로그램 또는 운영 체제 간의 변환기 역할을하여 프로그래밍을 단순화합니다. 프로그래머는 최종 사용자가 사용하는 특정 하드웨어에 관계없이 더 높은 수준의 응용 프로그램 코드를 작성할 수 있습니다.


기본적으로 GPU는 모든 작업을 수행하는 방법을 정확히 "인식"하는 방법은 무엇입니까? 드라이버는 기본적으로 드라이버가 제공하는 특수 명령을 사용하여 표시 할 이진 데이터를 계산하는 데 필요한 모든 사소한, 내장형 또는 하드웨어 회로 수준 기능을 제어합니까?

GPU는 마이크로 프로세서입니다. 따라서 그들은 처리합니다. CPU에서 공급 된 데이터 (예 : 요소의 위치)를 적절한 디스플레이로 처리합니다. 그들은 "알고있다"그들이 그런 식으로 제조되기 때문에 모든 작업을 수행하는 방법 사람들의 큰 그룹에와 GPU에서 데이터를 전송하는 적절한 방법에 동의했다.

디스플레이 드라이버를 버퍼 또는 프록시로 생각하십시오. 프로그램 창이고 사용자가 위로 이동한다고 상상해보십시오. GPU에 디스플레이를 새로 고치도록 요청합니다. 그러나 GPU가 Klingon 을 말하고 Vulcan 을 말하면 드라이버는 명령을 받아 명령을 GPU로 변환합니다.

그렇다면 GPU는 "특별한"언어 또는 "어셈블리"를 사용하여 CPU처럼 전송 된 명령을 이해합니까?


에서 위키 백과 :

ARB 어셈블리 언어는 하위 레벨 음영 언어이며 어셈블리 언어로 특성화 될 수 있습니다. 하드웨어 그래픽 파이프 라인을 제어하는 ​​GPU 명령어를 표준화하기 위해 OpenGL ARB (Architecture Review Board)에서 작성되었습니다.

이 예제가 있으며 개별 제조업체 (NVIDIA, ATI)에는 자체 명령 세트가 있음을 기억하십시오.

또한 OpenCL 및 GPU에 명령을 직접 프로그래밍하는 다른 많은 방법이 있습니다.

이 모든 것이 어느 정도 귀하의 질문에 대답해야합니다.

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