コラム18.  :グラフィックスのためのC言語

Cg  …  C for Graphics

C言語をベースとした言語には、C++や、Objective-Cなどが存在します。しかし、中には変わり種の、「グラフィックスのためのC言語」というものが存在します。それが、NVIDIA社によって開発された、Cg(C for Graphics)です。

Cgは、C言語をベースとして、一部C++の機能も取り入れ、GPUプログラミングのために特化・最適化されたプログラミング言語で、NVIDIA社のGPUの機能を最大限に引き出すために開発されたきわめて特殊なプログラミング言語です。

CPUとGPU

では、このGPUとはなんでしょう。GPUとは、Graphics Processing Unitの略で、パソコンやゲーム機等の画像処理を担当する主要な部品のひとつです。

コンピュータの頭脳はCPU(Central Processing Unit/中央演算処理装置)ですが、GPUは画像処理をもっぱら行うプロセッサです。このようなプロセッサが必要となる背景としては、それだけグラフィックスの処理には高度で複雑な計算を大量に行わなければならない、という背景があります。

GPUは、プログラマーがグラフィックス処理に必要な陰影計算処理(シェーディング)をプログラミング可能になっています。当初は、アセンブラをベースとしたもので、開発が難しいものでしたが、現在はC言語に文法の良く似たCg(リスト1.)などの出現により、プログラミングはより容易になっています。

また、CgのみがこういったGPUのプログラミング言語ではなく、そのほかに類似したものとして、GLSL、HLSLなどといったものも存在します。

リスト1:Cgのサンプルコード
// input vertex
struct VertIn {
    float4 pos   : POSITION;
    float4 color : COLOR0;
};

// output vertex
struct VertOut {
    float4 pos   : POSITION;
    float4 color : COLOR0;
};

// vertex shader main entry
VertOut main(VertIn input, uniform float4x4 modelViewProj) {
    VertOut output;
    output.pos     = mul(modelViewProj, input.pos); // calculate output coords
    output.color   = input.color; // copy input color to output
    output.color.z = 1.0f; // blue component of color = 1.0f
    return output;
}

GPUプログラミング

じつはこのGPU、本来の目的であるグラフィックスのプログラミングのみならず、科学技術計算などの分野でも大いに利用されています。もともとGPUは、グラフィックスの処理を目的とした作られていることから、単純な計算を行うことに向いています。

また、GPUの性能はピーク理論演算性能は同一価格帯のCPUをしのぐものがあります。そのため、並列性や演算密度の高い処理を行なう場合、少数で複雑な構成を備えた同規模のCPUと比べて高い処理性能が出せるのです。

そのため、この性質を利用して、汎用コンピューティング向けのGPU活用する技術が発展しました。それを、GPGPU (General-Purpose computing on Graphics Processing Units)と呼びます。

CUDA

そういった目的でのプログラミングを容易にするためにNVIDIAが提供しているGPU向けのC言語の統合開発環境こそが、CUDA(Compute Unified Device Architecture:クーダ)です。CUDAはコンパイラ (nvcc) やライブラリなどから構成されており、そのプログラムはC言語から呼び出して、C言語のプログラムと並行して処理を行うようにできています。

現在CUDAは、教育・研究機関での採用事例が多いですが、産業分野でも機械学習などの分野で活用されています。