Parallell trådutförande

Parallell Thread Execution ( PTX eller NVPTX ) är en lågnivå parallell trådexekvering virtuell maskin och instruktionsuppsättningsarkitektur som används i Nvidias CUDA - programmeringsmiljö . NVCC - kompilatorn översätter kod skriven i CUDA, ett C++ -liknande språk, till PTX-instruktioner (ett assemblerspråk representerat som ASCII -text), och grafikdrivrutinen innehåller en kompilator som översätter PTX-instruktionerna till den körbara binära koden som kan köras på bearbetningskärnorna i Nvidia GPU:er . GNU Compiler Collection har också grundläggande förmåga för PTX-generering i samband med OpenMP- avlastning. Inline PTX-montage kan användas i CUDA.

Register

PTX använder en godtyckligt stor registeruppsättning; utgången från kompilatorn är nästan ren enkeltilldelningsform , med på varandra följande rader som i allmänhet hänvisar till konsekutiva register. Program börjar med deklarationer av formuläret

   .reg  .u32  %r  <  335  >  ; // deklarera 335 register %r0, %r1, ..., %r334 av typen osignerat 32-bitars heltal  

Det är ett sammansättningsspråk med tre argument, och nästan alla instruktioner listar uttryckligen den datatyp (i termer av tecken och bredd) som de verkar på. Registernamn föregås av ett %-tecken och konstanter är bokstavliga, t.ex.

   
   shr.u64  %rd14  ,  %rd12  ,  32  ; // flytta höger ett osignerat 64-bitars heltal från %rd12 med 32 positioner, resulterar i %rd14   cvt.u64.u32  %rd142  ,  %r112  ; // konvertera ett osignerat 32-bitars heltal till 64-bitars  

Det finns predikatregister, men kompilerad kod i shader modell 1.0 använder dessa endast i samband med grenkommandon; den villkorliga grenen är

   @%  p14  bh  $label  ; // förgrena sig till $label  

Instruktionen setp.cc.type sätter ett predikatregister till resultatet av att jämföra två register av lämplig typ, det finns också en uppsättningsinstruktion , där set.le.u32.u64 %r101 , %rd12 , %rd28 ställer in 32-bitars registrera %r101 till 0xffffffff om 64-bitarsregistret %rd12 är mindre än eller lika med 64-bitarsregistret %rd28 . Annars %r101 satt till 0x00000000 .

Det finns några fördefinierade identifierare som betecknar pseudoregister. Bland annat %tid, %ntid, %ctaid och %nctaid trådindex, blockdimensioner, blockindex och griddimensioner.

Statliga utrymmen

Ladda ( ld ) och lagra ( st ) kommandon hänvisar till ett av flera distinkta tillståndsutrymmen (minnesbanker), t.ex. ld.param . Det finns åtta delstatsutrymmen:

  • .reg : registrerar
  • .sreg : särskilda, skrivskyddade, plattformsspecifika register
  • .const : delat, skrivskyddat minne
  • .global : globalt minne, delat av alla trådar
  • .local : lokalt minne, privat för varje tråd
  • .param : parametrar som skickas till kärnan
  • .shared : minne som delas mellan trådar i ett block
  • .tex : globalt texturminne (utfasad)

Delat minne deklareras i PTX-filen via rader i början av formuläret:

     .shared  .align  8  .b8  pbatch_cache  [  15744  ]  ; // definiera 15 744 byte, justerade till en 8-byte gräns  

Att skriva kärnor i PTX kräver explicit registrering av PTX-moduler via CUDA Driver API, vanligtvis mer besvärligt än att använda CUDA Runtime API och Nvidias CUDA-kompilator, nvcc. GPU Ocelot-projektet tillhandahöll ett API för att registrera PTX-moduler tillsammans med CUDA Runtime API-kärnanrop, även om GPU Ocelot inte längre aktivt underhålls.

Se även

externa länkar