DSPとは何?

こんにちはuzakadeuです。


前回携帯電話端末の中のDSPって何するの? - uzakadeuのブログという話をしましたが、そもそもDSPとは何?という話をしてなかったので、DSPについて説明します。はてなキーワードの説明「DSP」に詳しく説明されているので、こちらもご覧下さい。


デジタル信号処理では積和演算(MAC, Multiply and ACcumulation)がよく出てきます。
Y=\sum_{i=0}^NAi*Xi
とか

  y=0;
  for (i = 0; i < N; i++)
      y += a[i] * x[i];

という演算です。

DSPはこの積和演算を効率よく計算できるように設計されています。誤解を恐れずに言うと、低消費電力、低コストで積和演算を速く演算できることを中心に設計されたマイクロプロセッサがDSPである、というのが私の理解です。
具体的には...

  • 命令やそれぞれのデータをお互いに邪魔し合うことなく高速にフェッチできる。それぞれ別のメモリーに格納できるようにしたり(ハーバードアーキテクチャ)、デュアルアクセスメモリを内蔵したり、それぞれ専用のバスを持っていたりしました。(少し古いか)
  • 複数の積和演算を並行に行う仕組みがある。SIMD命令や、MAC演算ユニットを複数持っていたりします。
  • 大量の繰り返し演算をオーバヘッドなしで実行できる。繰り返し回数や繰り返し処理の終了アドレスなどを格納する専用のレジスタを持っており、それのレジスタを使える繰り返し演算命令を持っていたりします。(少し古いか)
  • 固定小数点演算(高速なのでよく使う)を効率よく実行できる。演算命令のオプションとして一ビットシフトが実行できたりするものがあります。
  • オーバフローに対する仕掛けがある。掛け算などにおけるオーバフローを防ぐためのガードビットがあったり、飽和演算命令または飽和演算モードがあったりします。
  • 特殊なアドレッシングモードがあり、演算命令の一部として追加コストなしで複雑なアドレス計算を行える。モジュロアドレッシング(リングバッファ用)やビット反転アドレッシング(FFT用)があったりします。

といった特徴を持っているものが多かったです。
他にも、意識する/しないにかかわらずDMA転送を多様している、等々の特徴もありました。


プログラムを作る方としては、その時々の使用するDSPの特徴に合わせてプログラミングする必要がありました。
例えばA[i]とX[i]のデータを別のメモリ空間に配置して効率よくアクセスできるようにするとか、ディレクティブを使ってアセンブラやCコンパイラにいろんな情報を積極的に伝えたりとか。


最近では汎用のマイクロプロセッサでも積和演算を高速にできる仕組み(ARMのDSP命令セットやNEONが一例)が組み込まれているらしい*1ので、いずれDSPという分類のマイクロプロセッサはなくなっていくのかもしれません。


今回はDSPとはどういうものなのか、をお伝えできれば幸いです。

*1:ごめんなさい。よく知りません