Ad[es] RX420IN 続き

昨日はWX310Kと同じかちょっと悪いぐらいと書きましたが、わたしが行く場所だとはっきり悪いとわかりました。
ネックストラップに下げて椅子に座って身体で覆ってしまってもWX310Kはアンテナ一本で粘り続ける場所で、Ad[es]だと圏外表示になってしまっていました。手に取ると圏内に復帰するので微妙な差なのですが、わたしが使う限りではちょっと気をつけないといけないようです。

と思っていたら「Advanced/W-ZERO3 es の時間」というBlogの記事に以下のような記述が・・・。

WX310SAの通信モジュールは、電波の強い基地局を見つけるたびに切り替えるけど、青耳は一度基地局から電波を掴んだら、近くに電波の強い基地局があってもすぐには切り替えないようチューニングされてるらしい。
電波が切れにくいからデータ通信時にはイイけど、通話時には糞仕様と言わざるを得ないな。

そういえば昨日、アンテナの中間地点にある自宅でWX310Kを使っていた時にはなかった、ノイズがひどい状態で通話が満足にできないということがありました。遠くのアンテナをつかんでいたのでしょうか。
音声通話には向いていないというか、音声通話向けのセッティングではないみたい?
セッティングだけの問題ならファームウェアのアップデートなどで音声通話重視になるとうれしいです。データ通信は圏内復帰で即レジュームできますし、速度は我慢もできるのですが、音声通話の方はそうはいかないですね。

「並列処理レベルの実用的な分類」を書いていたり

個別に扱われることはあるのですが、なかなか同時に扱われることがないのでまとめてみようかな〜と思って書きかけています。本当はBlogの記事ではなくWebページのコンテンツにしたいのですが。

ちなみに並列処理レベルの分類はILP(Instruction-Level Parallelism)、TLP(Thread-Level Parallelism)、PLP(Process-Level Parallelism)の3つを考えています。最近はDLP(Data-Level Parallelism)なんていう言葉を聞くこともありますが、ここでは扱いません。DLPの有無でプログラムから見た並列処理のインターフェースが変わったりはしないですし、そもそもデータの並列性が全く存在しなかったら完全な並行処理になるのでマーケティング用語なんじゃないかと疑っています。スレッドの話ではなくなってしまいますが、データフロー型プロセッサ上の並列処理の話ならDLPと言ってもいいかもしれません(/ヮ\)

ちなみにわたしが並列処理レベルの中で主眼を置いているのはTLPです。ILPはAsm分を栄養として摂取するという、まさに息を吸うようにプログラミングをしている方がいたりするのでとてもわたしが適当に何かをする余地はありません。PLPはあまり使われない言葉なのでおもしろくなさそう?と思われるかもしれませんが、実は歴史が古く、今でもTLPより一般的な並列処理技術です。PLPはカーネルスレッドライブラリが整備される以前のUNIX上の並列処理の唯一の選択肢でしたし、コンピュータ・クラスター上やグリッドコンピューティングなどでネットワーク越しに行われる並列処理も該当します。ILPに同じくこれもまた既に高みに昇っている人が多いのと、実行環境の入手と維持のコストが高いので手が出ません。TLPは未だにわたしでも書けそうなことがまとめられていないので何か書こうと思いました(*ノノ)

他にも並列処理関連の話題を書こうかと思っていますが、他人の役に立つかどうかは分かりません(そもそもわたしはプログラマーとは言えないので下手の横好きです)。

並列処理レベルの実用的な分類:ILP(Instruction-Level Parallelism)

項目 説明
インターフェース プロセッサ命令(一般的にはSIMD命令、積和命令)
処理対象 プロセッサ命令に対応するデータ型
処理対象データ量 レジスタかメモリ上の基本データ型2〜数個(bit単位)
実行主体 プロセッサの実行ユニット(プロセッサコア1個の内部)
同期手法 ハードウェアが暗黙的に行う
同期間隔 1〜数百クロック(nsオーダー)
期待できる性能向上率範囲 最大でも4倍は超えないぐらい*1
制限要素ネック 並列処理対象データがメモリ上の近い距離に配置されていなければ利用できず、プロセッサの処理能力に見合ったメモリ転送能力がシステムに要求される

インターフェースで「一般的にはSIMD命令」と断りを入れているのは、プロセッサがスーパースカラーやスーパーパイプライン、VLIWを採用している場合は全ての命令でILPを意識したコーディングができるのと、アウトオブオーダーや投機的実行に対応していると処理時間が並列処理的に変化するからです。個人的にはSIMD命令を扱えることよりも、この辺のプロセッサの挙動を読んでプログラミングできることの方がILPのテクニックという印象があります。

性能向上率は通常は2倍前後だと思いますが、VLIWを含めても4倍を超えることはないかな〜と思って400%以下としてみました。

ボトルネックの項目についてですが、ILPはレジスタ上のデータを対象とする処理なのでメモリからレジスタへ滞りなくデータが読み込まれなければ並列性が活かされません。汎用プロセッサにおいては一次キャッシュを有効に使うために処理の仕方によってデータの格納形式を適切な形にしておく必要があります。Array-of-Structures (AoS)にするのか、Structure-of-Arrays (SoA)にするのか、はたまたHybrid SoAなのかの選択がそれに当たります。
逆にTLPはマルチコアの場合は特にキャッシュのハードウェア機構、一般的にもメモリ空間を共有しており、それらが並行性制御の対象になる共有オブジェクトであることに留意して処理対象データ間の距離を確保しないとメモリアクセスにペナルティが発生します。
ILPのメモリアクセスに特別なハードウェア機構を持つDSPについては酔漢師匠の2191空挺団に「バスアーキテクチャの図」があります。新しいDSPの話がよければBlackfin空挺団の「メモリ周り」。DSPが大好きな方は「Blackfin(ADSP‐BF533)活用ハンドブック」を買って読むといいらしいです。

ちなみにわたしはHyperThreadingを含むSMT(Simultaneous Multi-Threading)も、TLPの情報を利用するもののILPの技術だと考えています。これはSMTがプロセッサ内の実行ユニットの利用率を高めるという、まさにILPと同じことを目的としていることや、SMPでは当然期待される同種の処理を並列に実行した際の性能向上をメモリアクセスのレイテンシの隠蔽という限られた範囲以外で期待できないことからそう考えた方がいいと思っています。
分類はあくまで一般的なプロセッサではこうだろうと決めつけて書いています。「そうじゃない、こうだ」とわたしの代わりに並列処理コンテンツを書いてくれる人が現れることを期待しています。また、世の中には恐ろしい命令を持ったプロセッサがあるらしいので、ILPでわたしの想像もつかないような処理をするプロセッサがあるかもしれません。

#7/25 積和命令、VLIW、実行主体、性能向上率について加筆。
 7/27 ボトルネックについて加筆。細かい修正。
 8/27 期待できる性能向上率範囲を修正(%をやめて倍率に)。ボトルネックを制限要素に変更

*1:IPC*1命令当たりの処理データ単位数*並列処理区間の割合