CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

ダフスデバイス

CMOCのマニュアルにある言語仕様を読んでいたら、サポートしない機能として
  ・Implementing Duff's device in a switch().

という記述に突き当たりました。「Duff's Device」とは何ぞ、何それおいしいの?

 

Wikipediaによると、「ダフスデバイスとは、C言語での可変長の連続的コピーをループ展開により最適化実装するときに直面する端数の問題を解決するための手法である。」とあります。

これってプログラミングの専門教育を受けると出てくる話なのかもしれませんが自分は生まれて初めて聞いた言葉です。例として示されていたコードをほぼそのまま持ってきてMSC/C++コンパイルできるようにしたのが以下のプログラムです。

f:id:O3I:20210213105059j:plain

関数scpy()はメモリ間で指定した長さをコピーしますがここにダフスデバイスの手法が使われているそうです。普通は*to++=*from++の1行を所定回数回せばいいわけですが毎周カウント数をチェックするのは煩わしい。ではループを完全に展開してしまって*to++=*from++を必要回数並べれば高速だけどコードサイズは大きくなるし回数が可変だと困る。両者いいとこどりをしてある程度まとまった回数だけループ展開しそのブロック単位でループカウントすれば判定回数は減るよね。ブロックサイズで割り切れない端数回数は何とかしましょう、という考えのようです。その端数処理がダフスデバイスのテクニックでソースコードにあるようにcase文の中にループの開始do、終了whileが紛れていてなんか非常に読みにくいですが、これでもちゃんとPC上でも8086ボード上でも動作しました。

 

f:id:O3I:20210213113343j:plain

まぁこの話題自体が数十年前からのもののようだし、今やCPU速度もメモリ領域も充分に大きいので小手先程度のテクニックは屁のようなものでしょう