<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cuda on QSysArch - Quantum Computer System Architecture</title><link>https://qsysarch.com/ja/categories/cuda/</link><description>Recent content in Cuda on QSysArch - Quantum Computer System Architecture</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Sun, 16 Nov 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://qsysarch.com/ja/categories/cuda/index.xml" rel="self" type="application/rss+xml"/><item><title>GPUコンパイラアーキテクチャ：CUDA、Triton、DeepSeek</title><link>https://qsysarch.com/ja/posts/cuda-compiler-architecture/</link><pubDate>Sun, 16 Nov 2025 00:00:00 +0000</pubDate><guid>https://qsysarch.com/ja/posts/cuda-compiler-architecture/</guid><description>&lt;p&gt;NVIDIA GPU 向けにコンパイルする場合、CUDA はしばしばリファレンスコンパイルフレームワークとみなされます。しかし、コンパイラは実際にはどのように動作しているのでしょうか？GPU 用の「実行可能ファイル」を作成する際に、コンパイラはどのような命令セットアーキテクチャ (ISA) を生成する必要があるのでしょうか？また、コンパイラは実際にはどのように動作しているのでしょうか？CPU から起動して GPU 上で実行できるコードを生成するために、どのようなアーキテクチャが使用されているのでしょうか？ &#10;&lt;img class="glightbox" src="https://qsysarch.com/images/cuda-q/cuda-logo.webp#right" alt="Cuda Q" style="width: 100%; max-width: 300px;"/&gt;&lt;/p&gt;&#10;&lt;p&gt;この日曜朝のメモは、NVIDIA GPUコンパイラアーキテクチャの概要を説明することを目的としています。GPU命令セット、CUDAフレームワークにおけるNVCCコンパイラ、そして最後に、GPU命令セットをターゲットとする代替アーキテクチャについて解説します。&lt;/p&gt;&#10;&lt;h1 id="低レベルgpuアーキテクチャ"&gt;&#10; 低レベルGPUアーキテクチャ&#10; &lt;a class="heading-link" href="#%e4%bd%8e%e3%83%ac%e3%83%99%e3%83%abgpu%e3%82%a2%e3%83%bc%e3%82%ad%e3%83%86%e3%82%af%e3%83%81%e3%83%a3"&gt;&#10; &lt;i class="fa-solid fa-link" aria-hidden="true" title="見出しへのリンク"&gt;&lt;/i&gt;&#10; &lt;span class="sr-only"&gt;見出しへのリンク&lt;/span&gt;&#10; &lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;GPUのようなデバイスをターゲットにする場合、それをプログラムするための命令セットが必要です。NVIDIAの場合、このデバイスはストリーミングマルチプロセッサ（SM）であり、右の図に示されています。この図で興味深いのは、IN32加算器、特殊機能ユニット、GEMM+++テンソルコアなど、多くの並列ユニットが存在し、コンパイラはそれらが最も効率的な方法（アイドル時間を最小限に抑えること）で使用される（パイプライン処理される）ようにする必要があることです。&#10;&lt;img class="glightbox" src="https://qsysarch.com/images/cuda-q/streaming-multiprocessor.webp#right-500px" alt="ストリーミングマルチプロセッサアーキテクチャ" /&gt;&lt;/p&gt;&#10;&lt;p&gt;使用されている用語は以下のとおりです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;ISA（命令セットアーキテクチャ）：命令の集合。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;マシンコード：命令をコンパクトかつバイナリ形式で表現したもの&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;アセンブリ言語：命令の簡潔さに欠けるテキスト表現&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;NVIDIA GPUには2種類のISA（命令セットアーキテクチャ）があります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;a href="https://docs.nvidia.com/cuda/cuda-binary-utilities/index.html#instruction-set-ref" class="external-link" target="_blank" rel="noopener"&gt;PTX&lt;/a&gt;: 並列スレッド実行 - CUDAカーネルをコンパイルする際に使用される中間アセンブリ。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;a href="https://modal.com/gpu-glossary/device-software/streaming-assembler" class="external-link" target="_blank" rel="noopener"&gt;SASS&lt;/a&gt;: ストリーミングアセンブリ。各GPUアーキテクチャに固有の低レベルアセンブリ。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;このカーネルをコンパイルしたいとしましょう。&lt;/p&gt;&#10;&lt;div class="code-block"&gt;&#10; &lt;div class="code-header"&gt; &lt;span data-label-text="C&amp;#43;&amp;#43;"&gt;&lt;i class="fas fa-code fa-fw small"&gt;&lt;/i&gt;&lt;/span&gt; &lt;button aria-label="copy" data-title-succeed="Copied!"&gt;&lt;i class="far fa-clipboard"&gt;&lt;/i&gt;&lt;/button&gt;&lt;/div&gt;&#10; &#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c++" data-lang="c++"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;__global__&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;normalizeVector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;blockIdx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;blockDim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;threadIdx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;vx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;vy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;len2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vx&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;vx&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;vy&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;vy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;invLen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rsqrtf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;len2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Use SFU fast reciprocal square root&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;invLen&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Normalized length&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;ここでの魔法は、&lt;code&gt;rsqrtf&lt;/code&gt; を SFU パイプラインにディスパッチすることです。これはどのように機能するのでしょうか？ 行 &lt;em&gt;float invLen = rsqrtf(len2);&lt;/em&gt; は、&lt;code&gt;rsqrt.approx.ftz.f32&lt;/code&gt; として PTX に変換され、次に &lt;code&gt;MUFU.RSQ&lt;/code&gt; として SASS に変換されます。これは、[godbolt](&lt;a href="https://godbolt.org/#g:!%28%28g:!%28%28g:!%28%28h:codeEditor,i:%28filename:%271%27,fontScale:14,fontUsePx:%270%27,j:1,lang:cuda,selection:%28endColumn:2,endLineNumber:15,positionColumn:2,positionLineNumber:15,selectionStartColumn:2,selectionStartL" class="external-link" target="_blank" rel="noopener"&gt;https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:cuda,selection:(endColumn:2,endLineNumber:15,positionColumn:2,positionLineNumber:15,selectionStartColumn:2,selectionStartL&lt;/a&gt; ineNumber:15,startColumn:2,startLineNumber:15),source:&amp;rsquo;&lt;strong&gt;global&lt;/strong&gt;+void+normalizeVector(float*+x,+float*+y,+float*+z,+int+n)%0A%7B%0A++++int+i+%3D+blockIdx.x+&lt;em&gt;+blockDim.x+%2B+threadIdx.x%3B%0A%0A++++float+vx+%3D+x%5Bi%5D%3B%0A++++float +vy+%3D+y%5Bi%5D%3B%0A++++float+len2+%3D+vx&lt;/em&gt;vx+%2B+vy&lt;em&gt;vy%3B%0A%0A++++//+Use+SFU+fast+reciprocal+square+root%0A++++flo at+invLen+%3D+rsqrtf(len2)%3B+%0A%0A++++//+正規化+the+vector%0A++++x%5Bi%5D+%3D+vx+&lt;/em&gt;+invLen%3B%0A++++y%5Bi%5D+%3D+ vy+*+invLen%3B%0A%7D&amp;rsquo;),l:&amp;lsquo;5&amp;rsquo;,n:&amp;lsquo;0&amp;rsquo;,o:&amp;lsquo;CUDA+C%2B%2B+source+%231&amp;rsquo;,t:&amp;lsquo;0&amp;rsquo;)),k:33.333333333333336,l:&amp;lsquo;4&amp;rsquo;,n:&amp;lsquo;0&amp;rsquo;,o:&amp;rsquo;&amp;rsquo;,s:0,t:&amp;lsquo;0&amp;rsquo;),(g:!((h:compiler,i:(compiler:nvcc130u2,filters:(b:&amp;lsquo;0&amp;rsquo;,binary:&amp;lsquo;1&amp;rsquo;,binaryObject:&amp;lsquo;1&amp;rsquo;,commentOnly:&amp;lsquo;0&amp;rsquo;,debugCalls:&amp;lsquo;1&amp;rsquo;, demangle:&amp;lsquo;0&amp;rsquo;,directives:&amp;lsquo;0&amp;rsquo;,execute:&amp;lsquo;1&amp;rsquo;,intel:&amp;lsquo;0&amp;rsquo;,libraryCode:&amp;lsquo;0&amp;rsquo;,trim:&amp;lsquo;1&amp;rsquo;,verboseDemangling:&amp;lsquo;0&amp;rsquo;),flagsViewOpen:&amp;lsquo;1&amp;rsquo;,fontScale:14,fontUsePx:&amp;lsquo;0&amp;rsquo;,j:1,lang:cuda,libs:!(),options:&amp;rsquo;-arch+sm_90+-use_fast_math+-O3&amp;rsquo;,overrides:!(),selection:(en dColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:&amp;lsquo;5&amp;rsquo;,n:&amp;lsquo;0&amp;rsquo;,o:&amp;rsquo;+NVCC+13.0.2+(Editor+%231)&amp;rsquo;,t:&amp;lsquo;0&amp;rsquo;)),k:33.333333333333336,l:&amp;lsquo;4&amp;rsquo; ,n:&amp;lsquo;0&amp;rsquo;,o:&amp;rsquo;&amp;rsquo;,s:0,t:&amp;lsquo;0&amp;rsquo;),(g:!((h:device,i:(compilerName:&amp;lsquo;NVCC+13.0.2&amp;rsquo;,device:&amp;lsquo;SASS+(sm_90)&amp;rsquo;,editorid:1,fontScale:14,fontUsePx:&amp;lsquo;0&amp;rsquo;,j:1,selection:(endColumn:6,endLineNumber:21,positionColumn:1,positionLineNumber:1,selectionStartColumn:6,s electionStartLineNumber:21,startColumn:1,startLineNumber:1),treeid:0),l:&amp;lsquo;5&amp;rsquo;,n:&amp;lsquo;0&amp;rsquo;,o:&amp;lsquo;Device+Viewer+NVCC+13.0.2+(Editor+%231,+Compiler+%231)&amp;rsquo;,t:&amp;lsquo;0&amp;rsquo;)),k:33.33333333333333,l:&amp;lsquo;4&amp;rsquo;,n:&amp;lsquo;0&amp;rsquo;,o:&amp;rsquo;&amp;rsquo;,s:0,t:&amp;lsquo;0&amp;rsquo;)),l:&amp;lsquo;2&amp;rsquo;,n:&amp;lsquo;0&amp;rsquo;,o:&amp;rsquo;&amp;rsquo;,t:&amp;lsquo;0&amp;rsquo;)),version:4).&lt;/p&gt;</description></item></channel></rss>