문제

현재 레이트레이서를 구현 중입니다.레이트레이싱은 연산량이 매우 많고 어쨌든 CUDA 프로그래밍을 조사할 예정이므로 두 가지를 결합한 경험이 있는 사람이 있는지 궁금합니다.계산 모델이 일치하는지 실제로 알 수 없으며 무엇을 기대하는지 알고 싶습니다.확실히 천생연분은 아닌 것 같지만, 적당한 속도 증가가 없는 것보다는 낫다는 느낌이 듭니다.

도움이 되었습니까?

해결책

CUDA에서 매우 조심해야 할 한 가지는 기본 GPU 하드웨어의 구조로 인해 커널 코드의 다양한 제어 흐름이 성능을 완전히 저하시킨다는 것입니다.GPU는 일반적으로 일관성이 뛰어난 제어 흐름(예:수백만 개의 픽셀이 있고 각 픽셀(또는 적어도 큰 폭)이 정확한 동일한 셰이더 프로그램, 심지어 모든 분기에서 동일한 방향을 취합니다.이를 통해 32개의 스레드로 구성된 각 그룹에 대해 단일 명령 캐시, 가져오기 단위 및 디코드 논리만 갖는 것과 같은 일부 하드웨어 최적화를 수행할 수 있습니다.그래픽에서 흔히 볼 수 있는 이상적인 경우에는 동일한 명령을 동일한 주기의 32개 실행 단위 세트 모두에 브로드캐스팅할 수 있습니다(이를 SIMD 또는 단일 명령 다중 데이터라고 함).그들은 할 수있다 에뮬레이트하다 MIMD(Multiple-Instruction) 및 SPMD(Single-Program). 그러나 SM(스트리밍 멀티프로세서) 내의 스레드가 분기되는 경우(분기에서 다른 코드 경로를 가져옴) 문제 논리는 실제로 사이클 바이에서 각 코드 경로 간에 전환됩니다. -주기 기준.모든 스레드가 별도의 경로에 있는 최악의 경우 하드웨어 활용도가 32배나 감소하여 CPU를 통해 GPU에서 실행할 때 얻을 수 있는 이점이 사실상 사라진다고 상상할 수 있습니다. 특히 다음과 같은 점을 고려할 때 그렇습니다. 데이터 세트를 CPU에서 PCIe를 통해 GPU로 마샬링하는 것과 관련된 오버헤드입니다.

즉, 광선 추적은 어떤 의미에서는 데이터 병렬이지만 다소 복잡한 장면에서도 제어 흐름이 광범위합니다.서로 바로 옆에 흩뿌려진 촘촘한 간격의 광선을 동일한 SM에 매핑하더라도 초기 바운스에 대한 데이터 및 명령 집약성은 오랫동안 유지되지 않습니다.예를 들어, 32개의 매우 일관성 있는 광선이 모두 구에서 반사되는 것을 상상해 보십시오.이 바운스 후에 그들은 모두 상당히 다른 방향으로 이동하며 아마도 다른 조명 조건 등을 사용하여 다른 재료로 만들어진 물체에 부딪힐 것입니다.모든 재질과 조명, 폐색 등의 세트조건에는 굴절, 반사, 흡수 등을 계산하기 위한 자체 명령 스트림이 있으므로 SM의 스레드 중 상당 부분에서도 동일한 명령 스트림을 실행하는 것이 매우 어려워집니다.광선 추적 코드의 현재 상태와 관련된 이 문제는 GPU 사용률을 16-32배로 감소시켜 특히 실시간인 경우(예:게임).예를 들어 여전히 CPU보다 우수할 수 있습니다.렌더팜.

현재 연구 커뮤니티에서는 새로운 종류의 MIMD 또는 SPMD 가속기가 검토되고 있습니다.나는 이것을 소프트웨어, 실시간 광선 추적을 위한 논리적 플랫폼으로 보고 싶습니다.

관련된 알고리즘과 이를 코드에 매핑하는 데 관심이 있다면 POVRay를 확인하세요.또한 광자 매핑(Photon Mapping)을 살펴보세요. 이는 광선 추적보다 물리적 현실을 표현하는 데 한 단계 더 가까워지는 흥미로운 기술입니다.

다른 팁

그것은 확실히 이루어질 수 있고, 이미 이루어졌으며, 현재 레이트레이싱과 Cuda 전문가들 사이에서 뜨거운 주제입니다.나는 정독하는 것부터 시작할 것이다 http://www.nvidia.com/object/cuda_home.html

그러나 그것은 기본적으로 연구 문제입니다.이를 잘 수행하는 사람들은 동료 검토를 거친 연구 논문을 얻고 있습니다.하지만 이 시점에서 여전히 최고의 GPU/Cuda 결과는 CPU/멀티 코어/SSE에서 동급 최고의 솔루션과 거의 경쟁적이라는 것을 의미합니다.그래서 Cuda를 사용하면 레이 트레이서가 가속화될 것이라고 가정하는 것은 조금 이르다고 생각합니다.문제는 레이 트레이싱이 "당황스러울 정도로 병렬"(그들이 말하는 것처럼)이지만 GPU에 직접 매핑되는 일종의 "고정 입력 및 출력 크기" 문제가 아니라는 것입니다. 트리, 스택, 동적 데이터 구조 등이 필요합니다. .Cuda/GPU로 할 수 있지만 까다롭습니다.

귀하의 질문은 귀하의 경험 수준이나 프로젝트 목표에 대해 명확하지 않습니다.이것이 첫 번째 Ray Tracer이고 단지 배우려는 것이라면 Cuda를 피하겠습니다. 개발하는 데 10배 더 오래 걸리고 아마도 좋은 속도를 얻지 못할 것입니다.당신이 어느 정도 경험이 있는 Cuda 프로그래머이고 도전적인 프로젝트를 찾고 있고 Ray Tracing이 배우기에 재미있는 일이라면 꼭 Cuda에서 시도해 보십시오.상업용 앱을 만들고 속도 경쟁 우위를 확보하려는 경우 -- 음, 현시점에서는 아마도 헛소리일 것입니다...성능 우위를 얻을 수 있지만 개발이 더 어려워지고 특정 하드웨어에 대한 의존도가 높아집니다.

1년 후에 다시 확인하세요. GPU 속도, Cuda 컴파일러 개발 및 연구 커뮤니티 경험이 한두 세대 더 지나면 대답이 달라질 수 있습니다.

Nvidia는 올해 NVision 컨퍼런스에서 CUDA의 레이 트레이서를 시연했습니다.여기에 대한 슬라이드 링크가 있습니다.

http://www.nvidia.com/object/nvision08-IRT.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top