マルチコアCPUのための最適化-データ構造の最適化

マルチコアCPU向けに最適化する場合、CPUキャッシュが複数ある事を踏まえて、データ構造を工夫する必要があります。
・CPUキャッシュメモリの動作
CPUにはキャッシュメモリがあり、プログラムの使用するデータがキャッシュされています。複数のCPUコアがある場合、CPUコアごとにキャッシュメモリを持っています。もしCPU Aがメモリにデータを書き込んだ時に、同じメモリをCPU Bがキャッシュしていた場合、そのままではCPU AとCPU Bがそれぞれ持つキャッシュメモリの一貫性(キャッシュコヒーレンシ)が失われてしまいます。そこで多くのCPUではキャッシュメモリと実データの一貫性が失われた事を他のCPUに通知し、キャッシュデータを破棄して再取得するための仕組みが用意されています。しかしその為には低速なCPU外部バスにアクセスしなければならず、プログラムの実行速度を大きくそこないます。マルチコアCPUの性能を引き出すためには、メモリの一貫性を破壊しないようにデータ構造を最適化しておく必要があるのです。
原則はスレッド毎の独立性を高めることです。各スレッド間で交換しなければならないデータ量を減らします。その上で各スレッドから変更する可能性のある変数が、同一メモリブロックに配置されないように、なおかつ、最小で済むようにデータ構造を工夫します。多くのCPUではキャッシュメモリを64バイト~128バイト程度のメモリブロック(キャッシュライン)に分けて管理していますから、このサイズも意識する必要があります。
注意が必要なデータ構造
・変数の共有
同一の変数を複数のスレッドから参照するのは、もっとも容易で安易な方法です。ですが変数を参照する箇所が少なかったり、あるいは更新頻度が少ない場合には必要十分な方法です。
ただし、その変数の前後で宣言されている変数が同一のキャッシュメモリブロックに配置される可能性が高い事を考慮する必要があります。もし変数に頻繁に書き込みをおこなえば、その前後で宣言された参照しかしていない変数も同時に影響を受けることになります。
影響を防ぐにはスレッドの初期処理でスタック変数に値をコピーし、スレッド内部ではコピーした値を使用します。スタックは各スレッドごとに用意され、他のスレッドと同じキャッシュメモリに配置される可能性はありません。これにより書き換えられる変数と同一のキャッシュメモリブロックに配置される可能性がなくなり、キャッシュのミスマッチに伴う動作速度の低下をなくせます。
・配列の使用
各スレッドが配列の異なる要素を参照している場合です。異なるデータに対して同じ計算を繰返しおこなう場合、データの管理や状況の管理が容易なので良く行われる方法です。
ただし配列の要素サイズが小さい場合、前後の要素が同じキャッシュメモリブロックに属する可能性があります。もし要素1の内容を書き換えた場合、他のスレッドで参照していた要素2でのキャッシュミスマッチが発生してしまいます。
メモリに余裕がある場合には配列の要素サイズがキャッシュメモリブロックの整数倍になるようにパディングをおこないます。キャッシュメモリブロックのサイズはCPUの種類ごとに異なるため、128バイトか256バイト程度の切の良いサイズにすることになります。
メモリに余裕が無い場合にはリンクリストなどを使い、要素ごとにヒープメモリ領域に格納します。コンパイラのメモリマネジメントにより同一メモリブロックに配置されてしまう可能性もありますが、回避できない要因として無視します。

typedef struct{
DWORD val1;
DWORD val2;
BYTE padding[xxx]; // 要素サイズが128バイトになるようにパディング
}PARAM;

int target = 16;
int param1;
int param2;
PARAM data[16];

void ThreadA(void)
{
int localParam1 = param1; // 変数をスタックに複製
int localParam2 = param2; //
int localTarget;
while (target > 0)
{
localTarget = target – 1;
target –;
data[localTarget].xxxx = ….;
}
}

VisualStudio 2003 Remote Debugの設定

・OSの設定
アプリケーションを実行するコンピュータにユーザアカウントを追加します。開発環境を動作させているコンピュータにログインする時に使用している同じアカウント名とパスワードで管理者ユーザを作成します。
コントロールパネルの管理ツールにあるローカルセキュリティポリシーを起動して、ローカルポリシーのセキュリティオプションにある「ローカルアカウントの共有とセキュリティモデル」の設定を「クラシック」に変更します。
ファイアウォールが有効になっている場合にはリモートデバッグを実行できません。必ず無効にしてください。
・Remote Debuggerのインストール
Visual Studio 2003のインストーラを起動し、Visual Studio .Net Setupの画面から「リモートコンポーネントセットアップ」をクリックします。表示されるHTMLにリモートデバッグコンポーネントの導入手順が書かれているので、それに従ってインストールしてください。

vs2003_setup.png
vs2003_remote.png

・デバッグの手順
リモートデバッガはサービスとして起動しているので、別途起動する必要はありません。
VisualStudioの開発環境からデバッグのプロセスにアタッチを実行してください。修飾子にアプリケーションを実行するコンピュータのコンピュータ名を指定すると、実行されているプロセスの一覧が表示されるので、デバッグするプロセスを選択します。

LED Lamp Bulb

LEDライトの個人輸入の話。
日本国内で見かけるLEDライトは懐中電灯だったり、自動車用であったり、装飾用であったりして家庭用のLED電球を見かけることはほとんど無い。検索すればいくつか見つけることはできるが、価格が高く到底エコノミーではありません。唯一簡単に手に入るのは常夜灯に使う小さな電球だけという状況です。
ヨーロッパの通販サイトを見ると、LED電球の内外価格差に驚きます。照明にも使える3W~5W程度のものが、安いものは500円程度で売られています。LED特有の冷たい明かりではなく、昼光色もあります。これが日本だと1000円以上。いつの間に、こんな価格差がついたんでしょう。500円以下なら電球型蛍光灯並みの価格帯、LEDに切り替えても元を取れるというものです。
個人輸入~と思ったのだけど、残念なことに欧州は240Vなんですよ。日本とほぼ同じ125V米国に期待したのだけれど、125VのLED電球はほとんどなく価格も高かったです。
日本でも同じ価格帯で商ってくれる商店が現れてくれるとうれしいな。

Degital Photo Frame

某掲示板でAmazon UKでDVDを購入するのが、ちょっとした祭りになっていた。その時にAmazonをみてちょっと気になったGoodsがある。1インチ前後の画面を備えたDegital Photo Frameだ。同様の商品を日本国内で目にした記憶はない。
キーホルダーサイズで1インチ前後の画面を備えたDegital Photo Frameが、1000円~3000円程度の価格で多種類扱われていて興味を引いた。日本でよく売られている5~7インチのDegital Photo Frameでは携行には絶えないし、仕事机の上に置くにもちょっと大きい。でもこのサイズなら気楽に持ち運べるし、仕事机の中にも気軽においておける。仕事の疲れをいやすグッズとして、ひとつどうだろうか?

Amazonプライム会員

Amazonプライム会員、一ヶ月無料体験してみた。
これは怖い。注文して直ちに確認画面にくると、すでに配送準備中のためにキャンセルも変更もできなくなっている。せめて1~3時間程度の間はキャンセルや変更を可能にするか、配送準備中であってもぎりぎりまでキャンセルや変更をみとめるか、どちらかにする必要があるんじゃなかろうか?