CPU와 GPU의 기하학적 변환


9

많은 3D 프로그램이 일반적으로 CPU에서 기하학적 변환뿐만 아니라 벡터 / 행렬 계산을 수행한다는 것을 알았습니다. GPU에서 이러한 계산을 버텍스 쉐이더로 옮기는 데 이점이 있습니까?

답변:


3

일반적으로 말하면 메시 변환은 GPU에서 수행됩니다. 변환 매트릭스를 GPU로 보내고 셰이더는이를 메시의 모든 정점에 적용합니다.

GPU를 사용하여 매트릭스 자체를 계산하는 것은 다른 문제이며 최종 변환 매트릭스를 결정하는 데 필요한 프레임마다 변경되는 저장된 값이 너무 많기 때문에 GPU에서 실제로 느려집니다. 이 데이터를 CPU로 (부터) 전송-GPU 속도가 느립니다. 또한 CPU에서는 계산이 한 번 수행되고 GPU에서는 각 정점에 대해 계산이 수행됩니다.


"실제로 GPU에서 느리게"부분을 작성하십시오. 이것은 매우 광범위한 진술입니다. GPU의 각 정점에 대한 행렬 구성에 대해 이야기하는 경우 성능은 병목 현상에 따라 다릅니다. GPU에 ALU / 레지스터 바인딩 된 경우에만 성능이 저하됩니다. 반드시 그런 것은 아닙니다. 이러한 병목 현상 시나리오에서 CPU에서 정확히 동일한 작업을 수행하면 속도가 느려집니다. 이것은 예 입니다 일반적으로 GPU에서 수행 : 즉시 정점 셰이더 구조의 정점 탄젠트 공간 매트릭스는 대역폭을 가져 정점 저장합니다. 병목 현상에 따라 YMMV도 마찬가지입니다.
jpaver

공감할 수는 없지만이 답변은 공감해야합니다. "GPU에서 실제로 더 느리게"말하는 것은 매우 잘못입니다.
Adam

3

비 GPU 프로세서에서 많은 기하학적 변환을 수행 할 수 있지만 대상 플랫폼을 고려해야합니다. 마일리지는 타겟팅하는 플랫폼 및 해당 플랫폼의 병목 상태에 따라 다릅니다.

한 가지 고려 사항은 지오메트리를 생성하는 장치와 해당 지오메트리를 렌더링하는 장치 사이의 버스 대역폭입니다.

일반적인 최신 PC 시스템에서 CPU는 PCIe 버스의 한 쪽 (http://en.wikipedia.org/wiki/PCI_Express)에 있고 GPU는 다른쪽에 있습니다. 프레임 당 생성 된 데이터를 CPU에서 GPU로 (또는 그 반대로) 전송할 수있는 유일한 방법은이 버스를 이용하는 것입니다. 이것은이 버스의 전송 속도에 의해 제한 될 수 있음을 의미합니다. 대상 플랫폼에 16 개 레인이있는 PCIe 2.x가 있으면 8GB / s 대역폭이 있습니다. 실제로, 일부 대역폭은 전송 중에 프로토콜에 사용되므로 PCIe를 통한 전송은 100 % 효율적이지 않습니다. 전송 크기에 따라 패킷 당 오버 헤드로 인해 대역폭의 5-10 %가 손실 될 수 있습니다.

예. 16 레인으로 PCIe 2.x를 실행하는 PC 플랫폼을 고려할 때 GPU에 공급하기 위해 프레임 당 얼마나 많은 데이터를 생성 할 수 있습니까? 60fps로 실행한다고 가정하면 PCIe 2.x의 경우 프레임 당 8GB / 60 = 136MB로 변환됩니다. 드라이버 통신 오버 헤드 및 PCIe 전송 프로토콜 오버 헤드를 설명하기 위해 일부 (추정 된) 90 % 요소를 곱하면 PCIe 2.x 대역폭의 제한없이 프레임 당 약 120Mb 데이터를 생성 할 수 있습니다.

대답해야 할 또 다른 질문 :이 120MB의 데이터 생성은 대상 CPU에서 1/60 초 만에 쉽게 달성 할 수 있습니까? CPU에서 다른 많은 게임 작업을 수행해야한다는 것을 기억하면 변환 된 데이터를 생성하는 데 시간이 부족할 수 있습니다. 순수한 ALU 처리량 측면에서 CPU를 제한 할 수 있습니다. CPU에서 sysmem 버스로 볼 때 대역폭에 따라 제한 될 수도 있습니다 (다양하지만 최근 CPU의 경우 약 8.5GB / s 임).

그렇다면 GPU에서 어떤 요소가 더 실행 가능합니까? 한 가지 요소는 GPU 메모리 대역폭으로, GPU와 로컬 비디오 메모리 사이의 대역폭입니다. 현대의 중간 범위 GPU에서이 비디오 메모리 대역폭은 최대 200GB / s (예 : PCIe 2.x 대역폭의 25 배)입니다. 또 다른 요인은 GPU가 엄청나게 병렬이고 수백 개의 ALU를 가지며 한 번에 수천 개의 스레드를 실행하여 메모리 액세스 대기 시간을 숨길 수 있다는 것입니다.

이러한 모든 요소는 GPU로 더 많은 작업을 추진하는 명백한 승리에 기여할 수 있지만 대상 플랫폼에 따라 YMMV가 다시 발생합니다.


1

"메쉬 변환"이란 무엇입니까? 행렬 집합으로 지오메트리 변형? 요즘 대부분의 게임은 GPU가 간단한 변형, 스키닝 등을 처리 할 수 ​​있도록 해줄 것입니다. 일부 플랫폼에서는 셰이더가 없거나 CPU에서 이러한 작업을 수행하면 다른 이점이 있습니다. 예를 들어 PS3에서는 SPU가 스키닝 및 변환을 처리하도록하여 RSX에서 약간의로드를 제거 할 수 있습니다. 다중 패스 조명을 수행하는 경우 CPU를 스키닝하는 것이 유리할 수 있습니다. 한 번만 수행하고 각 렌더링 패스에 대해 그려지는 결과를 제출하면되기 때문입니다. 따라서 예외가 있지만 일반적으로 대부분의 게임은 GPU와 쉐이더에서 이러한 작업을 수행합니다.

아니면 일반적인 벡터 수학에 GPU를 사용하는 것과 같이 더 멋진 것을 의미합니까? 요즘에는 CUDA와 같은 시스템을 통해 상당히 일반적인 C 코드를 실행할 수있는 범용 GPU가 있습니다. 무거운 벡터 수학에 이것을 활용할 수 있으며, 이것을 수행하는 프로그램이 있다는 것을 알고 있습니다. 그래도 개인적으로 경험이 없습니다.


질문을 명확하게하기 위해 "메쉬 변환"을 "형상 변환"으로 변경했습니다. 또한 내년 초에 사용할 수있는 opencl es를 기다리고 있습니다.
zmdat

0

GPU에 렌더링 된 모든 것이 의미가있는 상황이 있지만 셰이더 내에서 상수를 설정할 수 없으며 드로우 콜 전에 CPU 측을 제외하고는 설정할 수있는 곳이 없습니다.

사용자 지정 초기화 프로그램을 사용하여 GPU에서 본 변환 행렬과 같은 상수를 계산할 수 있더라도 원하지 않을 것입니다. GPU는 실제로 병렬 실행에 우수하지만 클럭 속도가 훨씬 느립니다.

자식 노드가 부모에 의존하기 때문에 계층 구조를 변환하는 것은 간단하지 않습니다. 그러나 정점은 서로 독립적으로 계산되므로 메쉬의 모든 정점을 변환하는 것입니다.

일반적인 규칙은 다음과 같습니다.

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