Smile Engineering Blog

ジェイエスピーからTipsや技術特集、プロジェクト物語を発信します

MIPSとMCPS(?)、100MIPSは100MHzで動くか?

信号処理とMISP(前編・後編)では、ソフトウェアのベンチマークとしてMIPS【Million Instructions Per Second 】が使われることについて書いてきました。
前編(信号処理とMIPS - Smile Engineering Blog
後編(信号処理とMIPS・後編 - Smile Engineering Blog

もう少し突っ込んだ話をしますと、実は開発の現場ではMIPSでちょっと困る話があります。

f:id:jspnet:20191015234008p:plain:left 命令数を指標としても1命令にどれくらいの時間*1がかかるのかによって実際の処理量(演算量)が変わるからです。そこで、あまり馴染みのない言葉かも知れませんが、MCPS【Million Cycles Per Second 】という表現をご存知でしょうか・・・
ここで「MCPS」という略語がスタンダードなものとして定着しているか?には賛否あると思いますが、本記事に関しては【Million Cycles Per Second 】の略として使用したいと思います。

MCPS【Million Cycles Per Second 】とは?

まずMIPSですが、

MIPS計算

そのソフトウェアが何命令か、Million Instructions Per Second なので1秒間に何百万命令か?ということですが、デジタル信号処理のソフトウェアを考えたとき、MIPS計算は次の式になります。この時のフレームサイズとはサンプル数です。

MIPS = 命令数 × サンプリング周波数 / フレームサイズ × 10^{-6}

MCPS計算

命令数をサイクル数に置き換えただけです。

MCPS = サイクル数 × サンプリング周波数 / フレームサイズ × 10^{-6}

ソフトウェアの演算量を表す時にMIPSという言葉を使う場合が多いですが、実際のところは命令数ではなくサイクル数による計測が多いです。命令数を測定した場合(または算出した場合)MIPSになりますが、実際のところは1命令に何サイクルかかるかによってMIPSの意味が変わります。

ソフトウェアに求められるMIPSとは、100MIPSは100MHzで動くか?

前回(信号処理とMIPS・後編 - Smile Engineering Blog)例にあげた地上波デジタル放送の放送局側のAAC-LCエンコーダでは、サンプリング周波数48kHzの場合21.33ms*2以内に処理しなければならないので、仮にCPUの動作クロックが100MHzだった場合、リソースを100%使えたとして*3、ソフトウェアに求められる演算量は2,133,333サイクル以内になります(200MHzなら4,266,666サイクル)。

AAC-LC 48kHzの1フレーム(ロングフレーム)のMCPSとMIPS

あるCPUに実装するソフトウェアに求められる要件として、その演算量を示す指標がMIPSだった場合、要件としては曖昧なところが出てきます。

CPU 動作クロック フレーム
21.33msのサイクル数
MCPS MIPS
2サイクルで1命令の場合
MIPS
1サイクルで1命令の場合
MIPS
1サイクルで2命令の場合
100MHzの場合 2,133,333 100 MCPS 50 MIPS 100 MIPS 200 MIPS
200MHzの場合 4,266,666 200 MCPS 100 MIPS 200 MIPS 400 MIPS

あるCPUで、この表のフレーム時間以内に収まるソフトウェア開発を依頼され、その要件が100MIPS以内だった時、出来上がったソフトウェアが99MIPSならば要件は満たしたことになります。ただし、動作クロックで100MHzで、2サイクルで1命令の場合は動かない事になります。
要件が100MCPS以内だった場合はどうでしょう。1命令に何サイクルかかるかに関わらず動作することになります。「CPUのリソース以内に収めろ!」という明確な要件だと思います。

メモリのレイテンシー

現代のCPUでは、1命令に2サイクル以上かかるインストラクションアーキテクチャはほぼないでしょう。MCPSとMIPSの差はメモリアクセスにかかるウェイトが発生する場合、MCPS > MIPSの関係になり次のようなイメージです。

MCPS = MIPS *4 + メモリレイテンシー

具体的には、キャッシュメモリで、例えばL1とかL2とかを耳にしたことはないでしょうか。CPUのコアの内部メモリをL1メモリ(L1キャッシュ)と呼び、コアの外にあるメモリをL2メモリ(L2キャッシュ)と呼ぶ場合が多いです。さらにL3があったり外部に拡張メモリという構成もあります。一般的には、L1は高速にアクセスでき、L2はコアの外のクロックを使用するためL1より時間がかかります。1サイクルで1命令のCPUの場合メモリがL1に収まっていればMCPS = MIPSとなりますが、L1に収まらずL2メモリを使用する場合ロード/ストア命令を実行する時にウェイトが入ります。L1キャッシュ構成の場合もキャッシュミスが発生しL2アクセスで待たされます。

100MIPSとオーダーされたら?

動作クロック100MHz(メモリ構成L1, L2)のCPUに搭載するソフトウェア*5の要件で、「100MIPS以内」という依頼があったらどうしましょうか? 仮に100MIPSのファームウェアを作った場合はどうなるのでしょうか。
メモリが全てL1に収まっていないと動かないことになります。L1キャッシュミスが発生しても動きませんので、要件としては「100MCPS以内」というのが適切かなと思います(個人的には)。 ただ、私の経験ではMIPS(ミップス)が定着していて、MCPS(エムシーピーエス)と言う人は少ないです(ちょっと言いにくい?)。

要件が100MIPS以内とされた場合、技術者としてどのようなソフトウェアを提供するか。。。 組み込みの技術者ならば、きっと動作クロック100MHzで動くもの(100MCPS)を提供しますね。

*1:サイクル数

*2:ロングフレームの場合

*3:現実的には、OSもそれなりにリソースが必要なので100%はありません

*4:1サイクルで1命令の場合

*5:ファームウェア