多次元デジタル信号処理(MDSP)とは、デジタル信号処理(DSP)技術を、複数の次元で変化する信号に拡張したものです。従来のDSPは通常、時間的に変化する音声信号などの一次元データを扱いますが、MDSPは二次元以上の信号を処理します。フーリエ変換やフィルタ設計など、一次元DSPの原理の多くは、多次元信号処理にも同様の原理が存在します。
グラフィックス処理ユニット(GPGPU)上で動作する最新の汎用コンピューティングは、高度な並列計算により、ベクトル演算と数値演算において優れたスループットを実現しています。デジタル信号、特に多次元信号の処理には、膨大な数の独立したデータサンプルに対する一連のベクトル演算が伴うことが多く、GPGPUは現在、画像処理、ビデオコーデック、レーダー信号解析、ソナー信号処理、超音波スキャンなどの多次元DSPを高速化するために広く利用されています。概念的には、GPGPUは中央処理装置(CPU)、デジタル信号処理装置(DSP)、またはその他のFPGAアクセラレータと比較して、計算の複雑さを劇的に軽減します。
多次元信号の処理は、科学研究や工学計算においてよく見られる課題です。一般的に、DSP問題の計算複雑度は次元数に対して指数関数的に増加します。しかしながら、時間的および記憶的な複雑度が高いため、多次元信号をリアルタイムで処理することは極めて困難です。1次元DSP問題向けには多くの高速アルゴリズム(FFTなど)が提案されていますが、高次元DSP問題に適用するにはまだ十分な効率性がありません。そのため、デジタル信号プロセッサで望ましい計算結果を得ることは依然として困難です。したがって、多次元DSP計算を高速化するために、より優れたアルゴリズムとハードウェアアーキテクチャが必要となります。
実際、多次元DSPを高速化するために、過去数十年にわたり、いくつかの一般的なアプローチが提案され、開発されてきた。
多次元DSPアプリケーションでリアルタイム要件を満たすための暫定的な方法として、サンプリングレートを低くすることが挙げられます。これにより、一度に処理するサンプル数を効率的に削減し、総処理時間を短縮できます。しかし、サンプリング定理によるエイリアシング問題や出力品質の低下につながる可能性があります。軍事レーダーや医療画像などの一部のアプリケーションでは、非常に高精度で正確な結果が求められます。このような場合、多次元DSP領域での計算量を削減するためにサンプリングレートを低くすることは、必ずしも許容されるとは限りません。
デジタル信号プロセッサは、ベクトル演算を処理するために特化して設計されています。これらは数十年にわたりDSP演算で広く使用されてきました。しかし、ほとんどのデジタル信号プロセッサは、並列処理できる演算数が限られています。このような設計は、音声処理(1次元信号)や画像処理(2次元信号)の高速化には十分ですが、多次元信号の膨大なデータサンプルを扱う場合、リアルタイムで演算結果を取得するには依然として力不足です。
多次元DSP演算を高速化するために、気象予報や軍事レーダーなど、特定の状況では専用のスーパーコンピュータやクラスタコンピュータの使用が必要となる。しかしながら、DSP演算のみを行うためのスーパーコンピュータを使用するには、相当な費用とエネルギー消費がかかる。また、すべての多次元DSPアプリケーションにとって実用的かつ適切な方法とは言えない。
GPUはもともと画像処理やビデオストリームのレンダリングを高速化するために考案されました。さらに、最新のGPUは比較的低コストでエネルギー効率も高く、並列数値計算を効率的に実行できるため、多次元DSPを実行するスーパーコンピュータの代替として人気が高まっています。[ 1 ]

現代のGPU設計は主にSIMD (単一命令複数データ)演算パラダイムに基づいています。[ 2 ] [ 3 ]このタイプのGPUデバイスは、汎用GPU(GPGPU)と呼ばれています。
GPGPUは、ベクトル演算ユニットまたはSIMD演算ユニットを用いて、複数の独立したデータに対して同時に演算を実行できます。最新のGPGPUは、数千もの同時スレッドを生成し、すべてのスレッドをバッチ処理できます。この特性により、多くのDSP問題は分割統治アルゴリズムで解決できるため、GPGPUはDSPアクセラレータとして容易に利用できます。大規模で複雑なDSP問題を多数の小さな数値計算問題に分割し、それらをまとめて一度に処理することで、全体の時間計算量を大幅に削減できます。例えば、2つのM × M行列の乗算は、出力データに依存することなく、GPGPUデバイス上でM × M個の同時スレッドによって処理できます。したがって、理論的には、GPGPUアクセラレーションによって、従来のCPUやデジタル信号プロセッサと比較して、最大でM × M倍の高速化を実現できます。
現在、GPGPUプログラミングをサポートする既存のプログラミング言語やインターフェースがいくつか存在する。
CUDAはNvidia GPUをプログラミングするための標準インターフェースです。NvidiaはNvidia GPUデバイス上でDSPアクセラレーションをサポートするために多くのCUDAライブラリも提供しています。[ 4 ]
OpenCLは、元々はApple Inc.によって提案され、現在はKhronos Groupによって維持および開発されている業界標準です。[ 5 ] OpenCLは、 GPGPUを含むさまざまなデバイスを普遍的にプログラミングするためのC++ライクなAPIを提供します。

次の図は、GPUデバイス上でOpenCLプログラムを実行する際のフローを示しています。まずCPUがOpenCLデバイス(この場合はGPU)を検出し、次にジャストインタイムコンパイラを呼び出してOpenCLソースコードをターゲットバイナリに変換します。その後、CPUは計算を実行するためにデータをGPUに送信します。GPUがデータを処理している間、CPUは自身のタスクを処理できます。
C++ AMPは、 Microsoftが提案したプログラミング モデルです。C++ AMP は、SIMD プロセッサのプログラミング用に設計されたC++ベースのライブラリです[ 6 ]
OpenACCは、 Cray、CAPS、NVIDIA、PGIによって開発された並列コンピューティングのプログラミング標準です。 [ 7 ] OpenAccは、 C、C++、Fortran拡張機能を備えたCPUとGPUの異種システム向けのプログラミングを対象としています。
AとBが2つのm × m行列であると仮定し、 C = A × Bを計算したいとします。
Cの各要素を計算するには、m 回の乗算と( m – 1 )回の加算が必要です。したがって、CPU 実装では、この計算を実行するための時間計算量は、次の C の例でΘ(n 3 )となります。しかし、 Cの要素は互いに独立していることがわかっています。したがって、GPGPU デバイスなどの SIMD プロセッサによって計算を完全に並列化できます。GPGPU 実装では、次の OpenCL の例に示すように for ループを展開することで、時間計算量はΘ(n)に大幅に削減されます。
// C言語におけるMxM行列の乗算void matrixMul (float * A 、// 入力行列 Afloat * B 、// 入力行列 Bfloat * C 、// 出力行列 Cint size ) // 行列のサイズ{// N x N x N 回の反復for ( int row = 0 ; row < size ; row ++ ) {for ( int col = 0 ; col < size ; col ++ ) {int id = row * size + col ;float sum = 0.0 ;for ( int m = 0 ; m < size ; m ++ ) {sum += ( A [ row * size + m ] * B [ m * size + col ]);}C [ id ] =合計;}}}// OpenCLにおけるMxM行列乗算__kernel void matrixMul (__global float * A , // 入力行列 A__global float * B , // 入力行列 B__global float * C 、// 出力行列 C__global int size ) // 行列のサイズ{size_t id = get_global_id ( 0 ); // 各スレッドは要素に対して作業を行うsize_t row = id / size ;size_t col = id % size ;float sum = 0.0 ;// N回の反復for ( int m = 0 ; m < size ; m ++ ) {sum += ( A [ row * size + m ] * B [ m * size + col ]);}C [ id ] =合計;}畳み込みはDSPで頻繁に使用される演算です。2つのm × m信号の2次元畳み込みを計算するには、出力要素ごとにm × ( m -1)回の乗算とm ×( m - 1 )回の加算が必要です。つまり、出力信号全体の時間計算量はΘ(n4 )です。次のOpenCLの例が示すように、GPGPUアクセラレーションを使用すると、すべての出力要素がデータに依存しないため、全体の計算時間は実質的にΘ(n2 )に短縮されます。
2次元畳み込み方程式:
// OpenCLによる2次元畳み込みの実装__kernel void convolution (__global float * x 、// 入力信号 x__global float * h , // h をフィルタリング__global float * y , // 出力信号 y__global int size ) // 入力信号とフィルタの ROS のサイズ{size_t id = get_global_id ( 0 ); // 各スレッドは要素に対して作業を行うsize_t row = size + size - 1 ; // 出力信号の行数size_t col = size + size - 1 ; // 出力信号の列数size_t n1 = id / row ;size_t n2 = id % col ;float sum = 0.0 ;// N x N 回繰り返しfor ( int k1 = 0 ; k1 < size ; k1 ++ ) {for ( int k2 = 0 ; k2 < size ; k2 ++ ) {sum += ( x [ k1 * row + k2 ] * h [( n1 * row - k1 ) + ( n2 - k2 )]);}}C [ id ] =合計;}上記の例では2次元畳み込みを示しましたが、同様のアプローチはより高次元のシステムにも適用できます。全体として、sD畳み込みの場合、GPGPU実装の時間計算量はΘ(n s )であるのに対し、CPU実装の時間計算量はΘ(n 2s )となります。
MD畳み込み方程式:
畳み込み演算に加えて、離散時間フーリエ変換(DTFT)もシステム解析でよく用いられる手法の一つである。
実際には、MD DTFT を実装するには、M 回 1-D DFTF を実行し、各次元に関して行列の転置を行うことができます。1-D DTFT 演算では、GPGPU は概念的に複雑さを Θ(n 2 )からΘ(n )に削減できます。これは、次の OpenCL 実装例で示されています。つまり、GPGPU の複雑さの MD DTFT は、GPU 上でΘ(n 2 )の複雑さで計算できます。一部の GPGPU にはハードウェア FFT アクセラレータが内部に搭載されていますが、この実装は、GPU メーカーが提供する FFT API またはライブラリを呼び出すことによって最適化することもできます。[ 8 ]
// OpenCLにおけるDTFT__kernel void convolution (__global float * x_re 、__global float * x_im 、__global float * X_re 、__global float * X_im 、__global int size ){size_t id = get_global_id ( 0 ); // 各スレッドは要素に対して作業を行うX_re [ id ] = 0.0 ;X_im [ id ] = 0.0 ;for ( int i = 0 ; i < size ; i ++ ) {X_re += ( x_re [ id ] * cos ( 2 * 3.1415 * id / size ) - x_im [ id ] * sin ( 2 * 3.1415 * id / size ));X_im += ( x_re [ id ] * sin ( 2 * 3.1415 * id / size ) + x_im [ id ] * cos ( 2 * 3.1415 * id / size ));}}多次元デジタルフィルタの設計は、特にIIRフィルタの場合、大きな課題です。通常、差分方程式を解いて近似解のセットを取得するためにコンピュータに依存します。GPGPUコンピューティングが普及するにつれて、GPGPUを使用して多次元FIRフィルタやIIRフィルタを設計するためのいくつかの適応アルゴリズムが提案されています。 [ 9 ] [ 10 ] [ 11 ]
レーダーシステムは通常、多数の 3 次元または 4 次元のデータサンプルをリアルタイムで再構築する必要があります。従来、特に軍事分野では、これにはスーパーコンピュータのサポートが必要でした。今日では、GPGPU もスーパーコンピュータの代わりにレーダー信号を処理するために使用されています。たとえば、合成開口レーダー (SAR)信号を処理するには、通常、多次元FFT計算が必要です。[ 12 ] [ 13 ] [ 14 ] GPGPU は、このようなアプリケーションで FFT および/または iFFT を高速に実行するために使用できます。
多くの自動運転車は、車両の自動制御に3D画像認識技術を適用しています。急速に変化する外部環境に対応するためには、認識と意思決定のプロセスをリアルタイムで行う必要があることは明らかです。GPGPUは、この目標を達成するための優れたデバイスです。[ 15 ]
正確な診断を行うためには、超音波、X線、MRI、CTなどの2次元または3次元の医療信号では、画像を再構成するために非常に高いサンプリングレートと画像解像度が必要となることがよくあります。GPGPUの優れた計算能力を適用することで、より高品質の医療画像を取得できることが示されています[ 16 ] [ 17 ] 。