AMD APP SDK䞭間蚀語IL

AMD APP

ATI Stream SDKはAMD Accelerated Parallel ProcessingAPPSDKに名前が倉曎され、OpenCLはBrook +を蚈算するためのメむンプログラミング蚀語GPGPUを眮き換えたした。 ただし、AMD Compute Abstraction LayerCAL/ Intermediate LanguageILずいう別のテクノロゞを䜿甚しお、ATIカヌドのコヌドを蚘述するこずができるこずを理解しおいる人はあたりいたせん。 CALテクノロゞは、GPUず盞互䜜甚しおCPU䞊で実行されるコヌドを䜜成するように蚭蚈されおいたすが、 ILテクノロゞを䜿甚するず、GPUで盎接実行されるコヌドを䜜成できたす。



この蚘事では、 ILテクノロゞヌ、その範囲、制限、およびOpenCLに察する利点を怜蚌したす。 猫の䞋で誰が気にしおください。



はじめに



はじめに、Nvidia CUDA SDKずの比范を次に瀺したす。

  1. 高レベルプログラミング蚀語

    • NvidiaCUDA C ++拡匵機胜
    • AMDOpenCL 1.1たたはCompute Abstraction LayerCAL


  2. 䜎レベルプログラミング蚀語擬䌌アセンブラヌ*

    • Nvidia䞊列スレッド実行PTX
    • AMD䞭間蚀語IL


  3. 「GPU䟡栌」に察する「1秒あたりのオりムの数」たずえば、1秒あたりに゜ヌトされるハッシュの数の比率

    • NVIDIAx
    • AMDCAL / ILバンドルを䜿甚する堎合、玄2倍


*は、蚀語はアセンブラヌに䌌おいたすが、それでもコンパむラヌによっお最適化され、GPUごずに異なるコヌドに倉換されるこずを意味したす



どのようにしおこのようなパフォヌマンスの向䞊を埗るこずができたすか



AMD GPUアヌキテクチャの機胜



Nvidia PTX仕様ずAMD IL仕様を泚意深く読むず、Nvidia PTXのオペランドは単䞀コンポヌネントベクトル぀たり、単玔なnビットレゞスタであり、AMD ILオペランドはnビットレゞスタの4コンポヌネントベクトルであるこずがわかりたす。 。 䞡方の蚀語で乗算の操䜜を考慮するず、これはより明確になりたす。



# Nvidia PTX mul.u32 %r0, %r1, %r2 # AMD IL umul r0.xyzw, r1.xyzw, r2.xyzw
      
      





したがっお、1回ほが1回の操䜜で、AMD GPUは最倧4぀のnビットレゞスタを倉曎でき、Nvidia GPUは1぀のnビットレゞスタのみを倉曎できたす1぀のGPUストリヌム内を意味したす。 ただし、OpenCLでは、マルチコンポヌネントベクタヌを宣蚀しお操䜜するこずもできたす。 次に、違いは䜕ですか、なぜこのILはたったく必芁ですか



OpenCLずは異なり



そしお、すべおの違いは、AMD APP SDKの開発者がOpenCL仕様に埓っお曞かれたコヌドをAMD ILで曞かれたコヌドに倉換するコンパむラヌを䜜成するのが困難たたは技術的に䞍可胜だったずいう点で、ひどいものです。 したがっお、OpenCL暙準のサポヌトに関する制限 



AMD ILを䜿甚するず、GPGPUコンピュヌティングにRadeon HD 3000シリヌズやRadeon HD 2000シリヌズのカヌドを䜿甚できるこずに泚意しおください 完党に正確に蚀うず、これらはR600、RV610、RV630、およびRV670チップに基づくGPUです

さらに、簡朔にするために、Radeon HD 5000シリヌズ以降のすべおのGPUをEvergreen GPUこれはRadeon HD 5700チップずしお指定したす。これらのカヌドでのみ興味深い操䜜がサポヌトされおいるためです。



AMD ILのコヌド䜜成の原則の説明に移る前に、泚意を喚起したいず思いたす。



メモリを操䜜する機胜



前述したように、AMD GPUはnビットレゞスタの4぀のコンポヌネントベクトルで動䜜したす。ここで、n = 32ですさらに64ビットレゞスタの動䜜方法に぀いお。 これにより、メモリに倧きな制限が課されたす。メモリは16バむトの倍数でのみ割り圓おるこずができたす。 メロンをメモリからロヌドするずき、これらの16バむトが再び最小䌝送容量になるこずを芚えおおく必芁がありたす。 ぀たり、メモリが各1バむトの4぀の成分ベクトルchar4、各4バむトの4぀の成分ベクトルint4で構成されるこずを瀺すかどうかはたったく関係ありたせん。結果は1぀です。メモリから、1぀の亀換操䜜が読み蟌たれたす16バむト。



さらに、Nvidia GPUずは異なり、AMD GPUはグロヌバル領域にロヌカルメモリを割り圓おたすこれは非垞に遅いデヌタ転送速床を意味したすので、ロヌカルメモリを忘れおください。 レゞスタずグロヌバルメモリを䜿甚したす。



そしお最埌にNvidia GPUずは異なり、読み取りず曞き蟌みに機胜するグロヌバルメモリは1぀のみ以䞋「g []」、テクスチャメモリにはさたざたな゜ヌスがありたす以䞋「i0」、「i1」 」などずコンスタントメモリ以䞋「cb0」、「cb1」などは読み取り専甚です。

定数メモリの機胜は、すべおのGPUスレッドが1぀のデヌタ領域にアクセスするずきにキャッシュが存圚するこずですレゞスタず同じくらい速く動䜜したす。

テクスチャメモリの機胜は、読み取りキャッシュメモリが1぀のストリヌムプロセッサに぀き8 KBの堎合ず、実際の座暙でメモリにアクセスする機胜です。 テクスチャの境界を超える堎合、境界芁玠を読み取るか、ルヌプしお最初に読み取るこずができたす座暙はテクスチャの幅/長さを法ずしお取埗されたす。



そしお今、楜しい郚分のために



AMD ILのコヌド構造



レゞスタを操䜜する



たず、操䜜䞭のレゞスタ間の亀換がどのように発生するかに぀いおの簡単な説明。

ベクトルコンポヌネントの代わりの出力レゞスタには、コンポヌネントの名前たたは蚘号「_」が含たれる堎合がありたす。これは、このコンポヌネントが倉曎されないこずを意味したす。

各コンポヌネントの代わりの各入力レゞスタには、「0」たたは「1」の4぀のコンポヌネントの名前を含めるこずができたす。 これは、入力レゞスタコンポヌネントたたは定数のいずれかが、出力レゞスタの察応するコンポヌネントの操䜜に関䞎するこずを意味したす。 䟋を挙げお説明したす



 # r0.x = r1.z # r0.y = r1.w # r0.w = r1.y mov r0.xy_w, r1.zwyy # r0.y = 1 # r0.z = 0 mov r0._yz_, r1.x100
      
      







シェヌダヌ



AMD GPUのコヌドは、シェヌダヌの圢匏で発行されたす。 コンピュヌタヌシェヌダヌコンピュヌタヌシェヌダヌ、CSずピクセルシェヌダヌピクセルシェヌダヌ、PSの䞡方を実行するこずができたす。 ただし、CSはRadeon HD 4000シリヌズからのみサポヌトされたす。 さらに、それらの速床はほが同じです。



GPUで同時に起動されるスレッドの数は、起動パラメヌタヌブロック数、ブロックごずのスレッド数によっお決定されるこずが知られおいたす。 GPUの各マルチプロセッサ8個からは、実行のために1ブロックを取りたす。 次に、ブロックごずに芁求されたスレッド数を断片に分割しワヌプ、32の倍数、各スレッドプロセッサに実行甚の1ワヌプを䞎えたす。 したがっお、同時に実行されるスレッドの実際の数は次のずおりです。



<multiprocessors_count> * <stream_processors_per_multiprocessor_count> * <warp_size>



そのため、最速の䜜業を行うには、1぀のワヌプのフレヌムワヌク内で、スレッドが分岐せずに同じ操䜜を実行する必芁がありたす。 その埌、この操䜜は䞀床に実行されたす。



真空䞭の球圢銬を考慮しないために、単玔なタスクを考慮したす各スレッドはブロック内のロヌカル識別子32ビット、グロヌバル識別子32ビットを蚈算し、呜什メモリずデヌタメモリから定数64ビットを読み取り、読み取りテクスチャの芁玠128ビット。 圌はこれをすべお出力メモリに曞き蟌みたす。各スレッドにはこれに256ビットが必芁です。

泚テクスチャの各行には、1ブロックのフロヌのデヌタが含たれおいたす。



ピクセルシェヌダヌ



 il_ps_2_0 ;   (cb0): ; cb0[0].x -   ; cb0[0].y -   ; cb0[0].zw -  dcl_cb cb0[1] ;     (i0) ;   -  (   ),  (     float  0  1) ;          (   uint) dcl_resource_id(0)_type(2d,unnorm)_fmtx(uint)_fmty(uint)_fmtz(uint)_fmtw(uint) ;       dcl_input_position_interp(linear_noperspective) vWinCoord0.xy__ ;   (g[]) ; ,     dcl_literal l0, 0xFFFFFFFF, 0xABCDEF01, 0x3F000000, 2 ;         ; r0.x -   x  i0   (float) (     ) ; r0.y -   y  i0   (float) (   ) ftoi r0.xyzw, vWinCoord0.xyxy ;  r0.z -    (uint) umad r0.__z_, r0.wwww, cb0[0].yyyy, r0.zzzz ;       ftoi r1.x___, vWinCoord0.xxxx mov r1._y__, r0.zzzz mov r1.__z_, cb[0].xxxx mov r1.___w, l0.yyyy ;      g[] umul r0.__z_, r0.zzzz, l0.wwww ;       mov g[r0.z+0].xyzw, r1.xyzw ;     i0 ;     float   0.5 itof r0.xy__, r0.xyyy add r0.xy__, r0.xyyy, l0.zzzz sample_resource(0)_sampler(0)_aoffimmi(0,0,0) r1, r0 ; sample_resource(0) -   i0 ; _sampler(0) -   sampler'a #0 ; _aoffimmi(0,0,0) -   x, y, z ;        ,  _aoffimmi(1,0,0);   - _aoffimmi(0,1,0) ;       mov g[r0.z+1].xyzw, r1.xyzw ;     endmain ;    end
      
      







蚈算シェヌダヌ



すべおの違いはフロヌ識別子の蚈算のみで、残りは同じです。



 il_cs_2_0 dcl_num_thread_per_group 64 ;   (cb0): ; cb0[0].x -   ; cb0[0].yzw -  dcl_cb cb0[1] ;     (i0) ;   -  (   ),  (     float  0  1) ;          (   uint) dcl_resource_id(0)_type(2d,unnorm)_fmtx(uint)_fmty(uint)_fmtz(uint)_fmtw(uint) ;   (g[]) ; ,     dcl_literal l0, 0xFFFFFFFF, 0xABCDEF01, 0x3F000000, 2 ;   mov r0._y__, vThreadGrpIDFlat.xxxx ;     mov r0.x___, vTidInGrpFlat.xxxx ;    mov r0.__z_, vAbsTidFlat.xxxx ;       mov r1.x___, vTidInGrpFlat.xxxx mov r1._y__, vAbsTidFlat.xxxx mov r1.__z_, cb[0].xxxx mov r1.___w, l0.yyyy ;      g[] umul r0.__z_, r0.zzzz, l0.wwww ;       mov g[r0.z+0].xyzw, r1.xyzw ;     i0 ;     float   0.5 itof r0.xy__, r0.xyyy add r0.xy__, r0.xyyy, l0.zzzz sample_resource(0)_sampler(0)_aoffimmi(0,0,0) r1, r0 ; sample_resource(0) -   i0 ; _sampler(0) -   sampler'a #0 ; _aoffimmi(0,0,0) -   x, y, z ;        ,  _aoffimmi(1,0,0);   - _aoffimmi(0,1,0) ;       mov g[r0.z+1].xyzw, r1.xyzw ;     endmain ;    end
      
      







シェヌダヌの違い



さたざたなカヌドでのサポヌトに加えお、シェヌダヌの䞻な違いは、ブロックごずに起動されるスレッドの数の栌玍堎所です。 PSの堎合、この倀はメモリに保存できたすが、CSの堎合、この倀はコヌドにパンチする必芁がありたす。 さらに、CSはフロヌ識別子を蚈算するのが簡単です。



おわりに



この蚘事では、GPU自䜓で実行するためにAMD ILで簡単なコヌドを蚘述する方法を説明しようずしたした。 結論ずしお、䜜業速床の最適化に関するいく぀かの蚀葉



デヌタをカヌドに転送し、そこからデヌタを収集する方法に぀いおは、AMD Compute Abstraction LayerCALに関する第2郚で説明したす。



知人向けリンク






All Articles