このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

パズル:スワップ・マシンの並列プログラミング

とある問題を考えていたら、パズルに出会ったのですが、僕はパズルが苦手なので、どなたか代わりに考えてください(苦笑)。

k個のメモリセルと1種類の機械語命令を持つ“マシン”を考えます。

  • メモリセルにはアドレスを付けます。ここでは番号付けを1番からはじめて、1, 2, ..., k がアドレスだとします。0からが好きなら、そうしてもけっこう。
  • iは、1からk-1のアドレスのどれかとして、機械語命令は s.i の形。その意味は、セルiの内容とセル(i+1)の内容を交換すること。

例えばメモリセルは4個だとして、その内容が AABB だったとします。次の命令列を実行してみます。

  • s.2, s.1, s.3, s.2

次のように状態遷移します。


AABB
s.2
ABAB
s.1
BAAB
s.3
BABA
s.2
BBAA

さて、このマシンはマルチコア(?)だとします。同時に複数の命令を実行できます。同時実行はブラケットで囲って示しましょう。

  • s.2, [s.1, s.3], s.2

次のように状態遷移します。


AABB
s.2
ABAB
s.1, s.3
BABA
s.2
BBAA

命令列「s.2, [s.1, s.3], s.2」において、[s.1, s.3]は1クロックサイクルで実行されるので、命令列全体=プログラムは3ステップと考えます。s.i と s.j で、iとjが隣り合っていなければ同時並列実行できます。いくらでも好きなだけ並列実行していいとします。

以上の条件のもとで次の問題を考えます。

k = n + m として、メモリの最初の状態は、Aがn個、Bがm個並んでいるとします。この状態を AnBm と書きます。まず、これをBmAn に直すには、最小何ステップかかるでしょうか? というのが1つ目の問題。

次に、最小ステップでも、そうでなくてもいいのですが、AnBm → BmAn と状態遷移させるプログラムの一般形を、n と m を含むなんらかの表現として書き下ししてください -- とっても曖昧な表現ですが、表現はできるだけキレイな形を希望。これが2つ目の問題です。

僕がほんとに欲しいのは“キレイな形”の表現です。

[追記]

oto-oto-otoさんからトラックバックをいただきました。マヤゲームとヤング図か、面白いなー。

このパズルには、誰でも思いつく一般化がいくつかあります。

  1. 文字の数を増やす。
  2. 初期状態と終状態を任意の文字列(メモリ状態)にする。
  3. リング状のメモリを考える(k番目のセルの次に1番目のセルが来るとする)。
  4. 左または右に無限なメモリ、あるいは両側に無限なメモリを考える。

基本命令を増やす方向では、入れ替えを2種類考えることができます。

要するにブレイドの話になります。文字を色だと思うと、紐とか釘が何色かに塗られたブライドですね。

命令数(交差の数)とステップ数(ブレイドの段数)に関して最適化が考えられますが、最適化は何らかのコスト関数の値を減らす方向での同値変形です。同値変形の背景は、ライデマイスター移動だのヤン・バクススター方程式だのでしょう。

このテの話は、簡単なんだか難しいんだか(僕には)予測できないので、面白そうだけど手を出しにくいなー。深入りするのはやめよう、っと。

[/追記]

[追記の追記]

似たようなことを、ナプキンに描いて考えてたとき:

[/追記の追記]