Nvidia RTX

Om DXR är det enda API applikationer använder sig av, vad är då RTX? Det är en plattform som består av både mjukvara och som förutsätter visst stöd i hårdvara. Nvidias RTX är inte knutet enbart till DXR, utan RTX är Nvidias bibliotek för DXR, Vulkan och något de kallar OptiX.

rtx_plattform.png

OptiX är knutet till Nvidias CUDA-ramverk, som är det API renderingsapplikationer och liknande använder om de vill utnyttja RT- eller Tensor-kärnorna. Detta har ingen direkt relevans för spel.

Både DXR och Vulkan i bilden illustrerar att RTX är den plattform Nvidia använder för att implementera de ray tracing-API:er som DXR respektive Vulkan definierar. Den relevanta informationen för spelsugna blir därför att RTX är en proprietär plattform som utnyttjar de specifika finesser som finns i Nvidias Geforce RTX 2000-serie. Dessa används till att accelerera ray tracing, som skapas genom ramverken DXR eller Vulkan Raytracing.

När AMD och även Intel framöver gör sina egna implementationer av DXR, kommer till exempel Battlefield V även fungera på de plattformarna. Detta då spelen jobbar mot ett GPU-agnostiskt API.

Tensor-kärnor

Framöver är det inte alls omöjligt att Tensor-kärnorna i slutändan kommer visa sig mer revolutionerande än RT-kärnorna. Det är mycket som händer kring maskininlärning just nu. Tensor-kärnorna har nämnts ihop med ray tracing som ett sätt att optimera prestanda via något som Nvidia kallar "Deep Learning Super Sampling" (DLSS). Men eftersom DLSS är en optimering som egentligen är helt oberoende från ray tracing lämnas tensor-kärnorna därhän.

CUDA-kärnor

När det gäller CUDA-kärnorna i Turing har de fått långt mer fokus på generella GPU-beräkningar, jämfört med föregående generationens Pascal som används i GTX 1000-serien. Det är något som kanske gläder de på SweClockers som renderar.

bmw_bench.png

Detta är scenen där ett par GPU:er och CPU:er jämfördes i.

poked.png

Jag använde denna som kontrollpunkt, då den ger ungefär samma relativa prestandaskillnad här mellan en Intel Core i7-5775C och Geforce RTX 2070 (min speldator) som i föregående scen.

Blender 2.8 har inte fått stöd för att använda RT-kärnor ännu, men även utan detta stöd syns ett rejält prestandalyft när ray trace-motorn Cycles kör på Turing.

Jag passade på att göra lite prestandajämförelser i Blender, där mycket pekar på att även streaming multiprocessor, beräkningsenheterna som innehåller CUDA-kärnorna, har optimerats för att göra ray tracing i spel möjligt. Det är ett relativt stort kliv upp jämfört med Pascal.

Det Blender har att erbjuda är långt ifrån ray tracing i realtid, men det handlar ändå om samma teknik som nu börjar leta sig in i en del speltitlar.

Bounding Volume Hierarchy

Innan det går att beskriva vad RT-kärnorna kan tänkas göra behövs bakgrund kring den viktigaste optimering som görs för att snabba upp ray tracing. Att bryta ned komplexa problem i mindre bitar, som var för sig är mycket enklare att lösa, är ett standardrecept för att hitta effektiva lösningar. För ray tracing är det enklare att avgöra om en stråle träffar ett rätblock jämfört med att direkt testa mot trianglar.

Bounding box.PNG

Blir områden i en BVH som saknar trianglar, en träff mot en BHV kan därför ändå sluta med att strålen inte träffar något

Bounding Volume Hierarchy (BVH) är en metod där 3D-modellerna i scenen stoppas in i rätblock på ett sätt så att alla trianglar för exempelvis en byggnad, bil eller huvud hamnar inom ett visst rätblock.

DirectX Raytracing (DXR) säger inget om att BVH ska användas, men DXR är specifikt designat för att en viss implementation ska kunna utnyttja denna optimering, något Nvidia gör med plattformen RTX.

RT-kärnor

RT-kärnorna är specifikt designade för att lokalisera den BVH eller triangel som en stråle passerar. Först lokaliseras rätt BVH, inuti en BVH finns endera flera mindre BVH-delar, alternativt återfinns trianglarna när man når botten.

NV_Turing_Editors_Day_025_575px.png
NV_Turing_Editors_Day_026_575px.png
NV_Turing_Editors_Day_029_575px.png

RT-kärnorna är optimerade för låg minneslatens. Det står i kontrast mot CUDA-kärnorna som primärt är optimerade för hög genomströmning, men de har relativt hög latens mot minne.

Vidare är CUDA-kärnorna "breda" men långsamma. Varje Streaming Multiprocessor (SM) kör 32 stycken CUDA-kärnor parallellt. Även om CUDA-kärnor i samma SM-pipeline kan hantera viss villkorad körning ("if-satser", där olika trådar tar olika vägar), kräver hög effektivitet att mängden villkorad körning hålls låg, något som passar ray tracing väldigt dåligt.

Problemet med ray tracing är att sekundärstrålarna ofta tar olika vägar, vilket betyder att även strålar från närliggande pixlar ofta tar olika beräkningsvägar. Det vill säga uppgiftsparallellt i stället för dataparallellt, som moderna GPU:er traditionellt optimerats för.

RT-kärnorna är därför antagligen betydligt "smalare" i sin design med mer fokus på hög "IPC". De är mer som en CPU, fast optimerade för en väldigt specifik uppgift, nämligen att ta en stråle som indata och räkna ut vilken BVH/triangel strålen först träffar.

rt_cores_fn.jpg

RT-kärnorna hanterar processen att hitta den triangel en viss stråle först passerar genom.

För att ta ett mer konkret exempel. Tänk att du har massor av modellbilar som är paketerade i lådor efter årsmodell. Nu vill du lokalisera alla bilar av årsmodell 1960-1970 av en viss kulör för att de ska målas om.

Att hitta de lådor som motsvarar rätt årsmodell motsvarar när RT-kärnorna lokaliserar rätt BVH. Nästa steg är att söka igenom de matchade lådorna efter bilar av rätt kulör, vilket motsvarar när RT-kärnorna letar efter de trianglar strålen passerar igenom.

Slutligen ska de matchande bilarna målas om. Det motsvaras av det program, den "shader", som CUDA-kärnorna gör på den triangel som matchar.

GeForce_EditorsDay_Aug2018_Updated090318_1536034900-34.jpg

I denna bild är ray tracing-steget längst till vänster. Gula blocket är CUDA-kärnor för flyttal, de motsvarar dina bil-letande kompisar. De används för att hitta en viss triangel inuti ett rätblock (BHV).

Separat ray trace-krets

På forum som SweClockers har frågan ställts om det vore möjligt att hantera acceleration av ray tracing via en separat krets.

Det korta svaret på frågan är "nej" med lösningen Nvidia valt för arkitekturen Turing. Det är allt för mycket information som delas mellan CUDA- och RT-kärnor för att det ska vara effektivt att separera de båda. Det är naturligtvis möjligt att göra en separat krets som löser motsvarande problem på en annorlunda sätt. DXR är ju väldigt icke-specifik kring exakt hur processen implementeras.

Det som ändå talar emot en separat krets är att hybrid-rendering, som Nvidia satsar på i dagsläget med Geforce RTX 2000-serien, är det enda realistiska alternativet i närtid. En viktig optimering för hybrid-rendering är ju att väldigt mycket information delas mellan rastrering och ray tracing. Till exempel geometrin samt att vissa effekter i samma triangel hanteras med ray tracing och andra med rastrering.