2008年9月30日火曜日

ファイルを開くときのデフォルトのアプリケーションの変更

ファイルをダブルクリックすると,そのファイルに関連づけられてるデフォルトのアプリケーションが開くよね.その設定を変更する方法について.ご存知の方がほとんどだとは思うけど,僕は忘れててググってしまったw

この設定は,ファイルの情報にある.ファイルの情報は,Finder からファイルを右クリックし,情報を見るをクリックすると出てくる次のようなウィンドウだ.



このウィンドウの「このアプリケーションで開く:」にあるアプリケーションを変更することで,そのファイルをダブルクリックしたときには,そのアプリケーションで開かれるようになる.また,「すべてを変更…」をクリックすると,類似したファイルはすべてそのアプリケーションで開かれるようになる.

というかんじ.僕の備忘録になってるねw

2008年9月29日月曜日

OpenMP 入門 #3

林檎生活100: OpenMP 入門 #2の続き.OpenMP 使って速くなるのを体感したいと思って,例題を探してきた♪

例題は,次の式に台形公式を適用して円周率を求めるというもの.



なんで求められるかはよくわかってないけど,やってみたら近似解が求められた♪そのプログラムは次のとおりで,THREADS と定義されている定数を1にしたバージョンと2にしたバージョンでそれぞれ計算してみると速度の違いがわかるはず.(もちろん,Mac Pro とかを持ってるリッチな方は,8とかにしても OK だと思う!)

#include <stdio.h>
#include <omp.h>

#define N 100000000
#define THREADS 2

int main(void)
{
int i;
long double top;
long double bottom;
long double step = 1.0L / N;
long double sum = 0.0L;

omp_set_num_threads(THREADS);

#pragma omp parallel private(top, bottom)
{
#pragma omp for reduction(+:sum)
for (i = 0; i < N; i++) {
top = 4.0L / (1.0L + (step * i) * (step * i));
bottom = 4.0L / (1.0L + (step * (i + 1)) * (step * (i + 1)));
sum += (top + bottom) * step / 2.0L;
}
}

printf("pi = %.16Lf\n", sum);

return 0;
}


ここで,reduction 句というものが初登場してる.これは,sum をそれぞれのスレッドで保持し,最後に同期するときにそれらを計算するというような指示をしている句だ.それぞれのスレッドで sum へどんどん加算し,最後にすべての sum を加算するというかんじ.reduction 句を無くすと遅くなるのがよくわかるので,試してみてほしい.

time コマンドで測定したら,次のような結果になった.音楽聞きながら(ちなみに,アーティストは capsule♪)実行という状況だったので,あまり信用できる結果ではないけどwww

・実行時間
1CPU:4.6秒
2CPU:2.4秒

・実行環境
機種:MacBook (Late 2006)
OS:Mac OS X
バージョン:10.5.5
プロセッサ:2 GHz Intel Core 2 Duo
メモリ:2 GB 667 MHz DDR2 SDRAM
GCC:4.4.0 20080801 (experimental)

およそ2倍の速度で計算できてるのがわかると思う.OpenMP で速度向上ってのが体感できるとおもうので,ぜひコンパイルして実行してみてね♪Mac Pro で実行してみたいな〜.

参考文献:
C 言語による OpenMP 入門

追記(2008年11月25日):
間違って追記した内容を修正.sum を初期化しなくていいと書いてたんだけど,間違っていた.reduction 句によって内部で準備されるプライベート変数が自動的に,加算なら0に乗算なら1に初期化されるのであって,sum のような変数は初期化されないので,やはり初期化する必要があった.

混乱を避けるため,前回の11月10日の追記は削除しました.コメントでご指摘いただきありがとうございました.

2008年9月28日日曜日

OpenMP 入門 #2

林檎生活100: OpenMP 入門 #1 の続き.OpenMP をやっていこう.今回は,for ディレクティブについてだね.正直,やってみたんだけど速くなってるかどうかわかんなかったwww

for ディレクティブってのは,そのまま for ループを並列化するためのディレクティブ.たとえば,次のような for ループを考えてもらうとわかりやすい.

for (i = 0; i < 100; i++)
c[i] = a[i] + b[i];


このループを,CPU が2つなら,それぞれの CPU に50回ずつやらせれば,2倍のスピードで計算できるよねって考え方だ.安直に分割するとこうなる.

・CPU1
for (i = 0; i < 50; i++)
c[i] = a[i] + b[i];


・CPU2
for (i = 50; i < 100; i++)
c[i] = a[i] + b[i];


これを,OpenMP でやるときに for ディレクティブを使う.for ディレクティブで書いてみるとこんなかんじになるらしい.

#include <omp.h>

#define CHUNKSIZE 100
#define N 1000

int main(void)
{
int chunk;
int i;
float a[N];
float b[N];
float c[N];

chunk = CHUNKSIZE;
for (i = 0; i < N; i++) {
a[i] = (float)i;
b[i] = (float)i;
}

#pragma omp parallel shared(a, b, c, chunk) private(i)
{
#pragma omp for schedule(dynamic, chunk) nowait
for (i = 0; i < N; i++)
c[i] = a[i] + b[i];
}

return 0;
}


これをコンパイルして実行すると,当然画面には何もでない.omp_get_num_threads() で調べてみたら,たしかにスレッド数は2になってた.うーん,速くなってんのかな?w

ディレクティブのオプションについて簡単に.

shared:スレッドの共有変数を指定している.
private:スレッドのプライベート変数を指定している.
schedule:ループをどうやって分割するかについて.引数に dynamic を指定すると,chunk サイズごとに空いているスレッドに動的に割り当てる.
nowait:for ディレクティブによって自動的に同期が取られるところで同期をとらない.

というかんじ.あってるかあやしいwいずれ書き直しになりそうな予感がする.ちゃんと本とか買って勉強した方が良さそうだなぁ.

参考文献:
OpenMP Tutorial

2008年9月25日木曜日

IEEE Computer Society の MSDN AA で追加ライセンス

IEEE Computer Society の MSDN AA からダウンロードした Windows XP Professional SP2 を2台目のコンピュータにも入れたいなと思って,MSDN AA にアクセスしたんだけど,ふたつ目のシリアル番号は取得できなかった.そういう仕様らしい.

MSDN AA の FAQ を見たら,管理者に連絡すれば,必要な分の追加ライセンスは取得できるというような内容が書いてあったので,MSDN AA のとこに書いてあったメールアドレスにメールを送ってみた.(help@〜ってアドレス.)メールの内容は,英語で「2台目のコンピュータにインストールしたいんだけど,どうしたらインストールできんの?」ってかんじw英文はかなり間違ってそうなので,ここには載せられないwww

メールを9月22日の17時くらいに送って,9月25日の1時くらいに届いた.本文(署名は抜いてる.)はこんな感じ.

Hello, 

I've issued you an additional key. You may use this to install on a second computer.

Best regards,


くわえて,MSDN AA の方からもライセンスが発行されたメールが自動的に送られてきた.内容は,新しいシリアル番号が発行されたよ.ログインして確認してみてね.ってかんじ.

当然,そのシリアル番号を使ってアクティベーションを通したら,問題なく使えるようになった.適当な英語でも全然問題なかったので,追加ライセンスがほしい人は,メールで催促しよう.有効活用しないとね♪

2008年9月24日水曜日

Boot Camp で Windows XP SP3

最近,更新してなかったなぁ.帰省とかインターンとかで,更新できなかったんだよね.

今回は,Boot Camp で Windows XP Professional SP2 をインストールして,Service Pack 3 をインストールするところでハマったことについてwもう答えがわかってる人が大半だとは思うけど,Boot Camp を2.1にアップデートしてなかったからだねwww

それに気づかずに,VMware Fusion から起動して SP3 をインストールするとかして,無理矢理解決してしまったよw

2008年9月16日火曜日

Boot Camp でのキーボードマッピング

Boot Camp で MacBook のキーボードから,PC のキーボードにしかないキー入力をするためのキーボードマッピング.「Boot Camp インストールと設定ガイド」の表をベースにしている.

○MacBook キーボード(US 配列)
Shift: shift
Ctrl: ctrl
Alt: option
Windows: command
BackSpace: delete
Delete: fn+delete
Enter: return
Enter(テンキー): enter
Ins: fn+enter
Pause/Break: fn+esc
NumLock: fn+f6
PrintScreen: fn+f11
ScrollLock: fn+f12
alt+「半角/全角」*: option+`(バッククォーテーション)

複合したキー入力はこの表から変換して,そのまま複合させれば OK.

*「半角/全角」と「`(バッククォーテーション)」のスキャンコードは同じなので,「`(バッククォーテーション)」を入力するだけで IME をオン/オフできる.しかし,キーボードが JIS 配列か US 配列かで(Windows では読み込むドライバが司っているらしい.)その動作を変えているようなので,option+`(バッククォーテーション)というキー入力が必要になるみたい.それにしても,alt+「半角/全角」とか時代を感じるねw

2008年9月15日月曜日

VMware Fusion で Age of Empires II Gold Edition

Age of Empires II やりたいなぁって思って,Age of Empires II Gold Edition を買ったんだよね.古いゲームだから,VMware Fusion 上の Windows XP でもサクサク動くでしょ〜って思ったんだよ.だけど,やってみたら重いwプレイできなくはないけどね.調べても VMware Fusion 上で Age of Empires II Gold Edition をやってみたってのを発見できなかったので,とりあえず書いておこう.

○実行環境
MacBook (Late 2006)
OS: Mac OS X 10.5.4
CPU: 2 GHz Intel Core 2 Duo
RAM: 2 GB 667 MHz DDR2 SDRAM

VMware Fusion
Version: 1.1.3
OS: Windows XP Professional
RAM: 512 MB
テーマ: Windows クラシック
視覚効果: パフォーマンスを優先する
その他: Microsoft Update でインストールできるものはすべてインストール.Windows Live OneCare 体験版をインストール.

○不具合
・ゲーム中のマウスポインタがおかしい
・動作が重い

あと,不具合ではないけど,マウスポインタが画面外に行くので,画面のスクロールが非常にやりにくいんだよなぁ.MacBook 側の解像度を合わせれば解決できそうだけどさ.

さてと,BootCamp でやるかぁ.

追記(2008年9月24日):
VMware Fusion 2.0 で実行すると普通の速度になってた.改善され模様.ただ,1024x768でプレイしようとするとうまくいかなかったので,結局 Boot Camp 上の Windows XP でやってる.Windows Vista でも試してみたけど,256色のパレットカラーがおかしくなるのか,ところどころ赤くなったりして,見た目がよくなかった.(Vista と MacBook の組み合わせでなったので,Vista だとおかしくなるのかどうかはわからない.)プレイするなら Boot Camp + Windows XP だね.