2013-03-03 携帯電話買い換えた話
学割を使って携帯電話が契約できる今のうちにすべてのキャリアを契約してしまえ!ってことでDocomo、au、Softbankすべて契約するという暴挙に出た。2年後に全部MNPして電話番号維持しつつ本体代の割引狙う魂胆(果たして2年後どうなることやら)データ通信についてはWiMAX使うので、最低料金で運用することを主眼に置いている。
まずDocomoからXperiaZ SO-02E(ブラック)
Xperia™ Z SO-02E | ソニーモバイルコミュニケーションズ
画面がでかくてFullHDの高精細なのだが「いかにフォントを美しく見せるか/いかに画像と映像を高精細に見せるか」に注力しているため、一度に画面に表示できる情報量はMIDやタブレットよりは少ない印象。
プリインストールソフトとしてはGoogleマップを利用したカーナビゲーションソフトの「Sonyドライブ」と、言わずと知れた「WALKMAN」が今のところのお気に入りである。Sonyドライブは通常のGoogleマップよりはカーナビとしては洗練されている。WALKMANについても気合が入っているようで試供品のイヤホン「MH-EX300AP」が付属する。
今回契約したプラン:本体代24回払い3011円+タイプXiにねん0円+spモード315円+Xiパケホーダイダブル2100円(上限6510円)+ケータイ補償399円−月々サポート1995円=3831円(最大8241円)
http://www.apple.com/jp/iphone/
もはや説明あるまい。iOS用アプリが試したかった。ただそれだけ。iPadのWifiモデルやiPodでもいいじゃんって言われたらそれまでなんだが。
今回契約したプラン:本体代24回払い2570円+基本使用料0円+AppleCare366円=2936円
不必要なもの全部外してくれ!って言ったら実質本体代とAppleCareしか残らなかった。通話はできるがデータ通信はおろかメールもできない仕様である。
最後にSoftbankからArrows A101F(マゼンタ)
http://www.fmworld.net/product/phone/101f/
今回契約した中で一番どうでもいいポジション(電話番号さえ手に入ればよい)なのでこれだけ4Gではなく型落ちの3G端末。とはいえ今まで使ってたIS05に比べたら断然処理速度は速い。
今回契約したプラン:本体代24回払い980円+ホワイトプラン0円+S!ベーシックパック315円+パケットし放題S390円+安心保障パック498円−バリュープログラム490円=1693円
最後にWiMAXであるが、今回はWiMAX+3Gを契約した。月額使用料3880円+プロバイダ使用料525円=4405円
全部ひっくるめて12865円/月となるが、果たして安かったのか高かったのか。
まぁWiMAXは春からのインターネット回線としての役割も担っているから、純粋な携帯代は8460円である。3回線維持してこの値段ならまぁ許せんこともないかなぁといったところか。
2012-11-19 USB3.0の外付けHDDケースの話
今使ってるノートパソコン(富士通のLIFE BOOK PH75/DN)にはUSB3.0ホストが付いているんだが、USB3.0対応デバイスは持っていなかった。
今回、2.5インチHDD(東芝MK6465GSX)が手に入ったのでポータブルHDDとして運用すべく、玄人志向のGW2.5TL-U3/BKを買ったので、ベンチマークをとってみた。
玄人志向 - 商品一覧 » ラクラクシリーズ » ケース関連 » 2.5型HDDケース » GW2.5TL-U3/BK
このケース、ドスパラで980円と不安になるぐらいの安さ(今回はポイント使ったのでタダ)であったが、それなりの速度で動いている。
参考のためにeSATAとの比較を行った。ケースはOWL-ELCD35/EU、パソコンがeSATAポートを持たないため、ExpressCard対応ホストアダプタEX34Nを使用した。
Owltech ドライブケース OWL-ELCD35/EUシリーズ ガチャポンパッ!
2012-11-10
MPI超超入門 第2回 「もっとHello world編」
前回はお約束通り「Hello world」してみましたが、実行時オプションで強制的に並列実行しただに過ぎませんでした。
そこで今回は、きちんとした「MPIでのHello world」をしてみたいと思います。
まず最初に、MPIを使用したもっとも簡単なプログラムについて紹介します。
最低限のMPIプログラム
program main
include 'mpif.h'
call MPI_INIT(IERR)
call MPI_COMM_SIZE(MPI_COMM_WORLD,NPROCS,IERR)
call MPI_COMM_RANK(MPI_COMM_WORLD,MYRANK,IERR)
write(*,*)'Hello world!','NPROCS=',NPROCS,'MYRANK=',MYRANK
call MPI_FINALIZE(IERR)
stop
end
このソースコードについて説明します。
include 'mpif.h'
インクルードファイル'mpif.h'がインストールされる場所は環境によって異なります。MPIを使用したプログラムを書く場合は必ずこのmpif.hをインクルードしてください。この中身について知る必要はありません。*1
call MPI_INIT(IERR)
MPI_INITで指定する引数(この例ではIERR)は必ず指定される必要があります。コールしたMPIサブルーチンが正常に終了すれば「0」、エラーが発生した場合はそれ以外の値が戻ってきます。
このサブルーチンと指定する引数を指定しなかった場合segmentation fault等でエラーとなるので、必ず指定される必要があります。
call MPI_COMM_SIZE(MPI_COMM_WORLD,NPROCS,IERR)
call MPI_COMM_RANK(MPI_COMM_WORLD,MYRANK,IERR)
ここではまとめて説明します。この二つのサブルーチンはコミュニケータに属しています。
MPI_COMM_SIZEの第二引数(ここではNPROCS)は、MPI実行時のプロセス数です。
MPI_COMM_RANKの第二引数(ここではMYRANK)は、MPI実行時の各プロセスに割り振られる背番号です。
二つのサブルーチンの第一引数「MPI_COMM_WORLD」はコミュニケータと呼ばれるグループ名です。
コミュニケータは、MPI実行時の全てのプロセスをまとめたものです。
call MPI_FINALIZE(IERR)
MPIの終了処理を行うサブルーチンです。これを書かなかった場合、誤作動を引き起こすことがありますので必ず記述してください。
mpif90 hello_mpi.f -o hello_mpi.out -mcmodel=medium
mpirun -n 4 hello_mpi.out
Hello world! NPROCS= 4 MYRANK= 2
Hello world! NPROCS= 4 MYRANK= 1
Hello world! NPROCS= 4 MYRANK= 0
Hello world! NPROCS= 4 MYRANK= 3
全てのプロセスで「Hello world! NPROCS= 4」が表示された一方で、「MYRANK」の数がプロセスごとに異なりました。
これは、プロセスの総数を表すNPROCSが一定である一方、MYRANKの値がそれぞれのプロセスに固有であることからご理解いただけるご思います。
また、注目すべき事柄として「MYRANK」が「1」から始まる数ではなく、「0」から始まる数であること、さらに重要なことに「MYRANK」が昇順あるいは降順になるとは限らないことが挙げられます。
特に後者に関してよくある誤解として「MYRANKの順番どおりに処理が実行される」というものがありますがこれは間違いですので、プログラムを書くときは「どのプロセスが一番先に始まり、どのプロセスが一番最後に終わるかは実行時によって違う」ということを覚えておいてください。実際、この次に実行した際の結果は以下のようなものでした。
Hello world! NPROCS= 4 MYRANK= 0
Hello world! NPROCS= 4 MYRANK= 3
Hello world! NPROCS= 4 MYRANK= 1
Hello world! NPROCS= 4 MYRANK= 2
次に、同様のプログラムをC言語で書いた場合について説明します。
#include "mpi.h"
#include <stdio.h>
int main(int argc, char **argv)
{
int n, myid, numprocs, i;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
printf("Hello world! numprocs=%d myid=%d\n", numprocs, myid);
MPI_Finalize();
}
このソースコードについて説明します。
#include "mpi.h"
C言語の場合はインクルードファイル'mpi.h'を必ずインクルードしてください。この中身について知る必要はありません。
MPI_Init(&argc,&argv);
MPI_Initで指定する引数はmain関数で指定される引数と同様にする必要があります。FORTRANのIERRに相当する引数は指定する必要はありません。
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Comm_sizeの第二引数(ここではnumprocs)は、MPI実行時のプロセス数です。
MPI_Comm_rankの第二引数(ここではmyid)は、MPI実行時の各プロセスに割り振られる背番号です。
二つのサブルーチンの第一引数「MPI_COMM_WORLD」はコミュニケータと呼ばれるグループ名です。
FORTRANのように第三引数IERRに相当する引数は必要ありません。
MPI_Finalize();
MPIの終了処理を行うサブルーチンです。これを書かなかった場合、誤作動を引き起こすことがありますので必ず記述してください。
引数を指定する必要はありません。
mpicc hello_mpi.c -o hello_mpi.exe -mcmodel=medium
mpirun -n 4 hello_mpi.exe
Hello world! numprocs=4 myid=3
Hello world! numprocs=4 myid=2
Hello world! numprocs=4 myid=1
Hello world! numprocs=4 myid=0
次回からはデータ並列処理のプログラムを紹介します。
*1:中身についての簡単な説明はまたの機会にしたいと思います
2012-11-07
MPI超超入門「Hello world編」
スーパーコンピューターとかで使われる分散メモリ間のメッセージ通信APIの規格であるMPI(MessagePassingInterface)の超超入門。
これを勉強すれば複数のコンピューターを使ってちょうすげぇ計算ができるよ。
ものすごくざっくりした説明をすると
例1.「1〜10までの整数の足し算を二人で行う」
この例では、一人目が1〜5の総和を求め、二人目が6〜10の総和を求め、最後に二人が求めた結果を足せば答えになる。
ここで問題となるのは、「二人が求めた結果を足す」ためには、どちらかの結果をどちらかに伝えなければならない。
例2.「1〜10までの整数について、それぞれの数の一つ前と一つ後の数との和を求める作業を、二人で行う」
分かりにくいので具体的にいうと、「1」については一つ前の数が0で、一つ後の数が2なので、1に対応する答えは0+1+2=3となる。
この例でも、一人目が1〜5について求め、二人目が6〜10について求めるとする。
ここで問題となるのは、一人目が5について答えを求める時、5の一つ後の数である6を、二人目からもらわねばならないことである。
逆に、二人目が6について答えを求める時、6の一つ前の数である5を、一人目からもらわねばならないことである。*1
これらの問題を解決するために用意されるのがMPIであり、C言語にもFORTRANにも実装できる大変嬉し恥ずかしいAPIとなっている。
では記念すべき第一回として、お約束通り「Hello world」をしてみたいと思う。*2
program main
include 'mpif.h'
write(*,*)'Hello MPI'
stop
end
mpif90 hello.f -o hello.out -mcmodel=medium ←コンパイラはpgfではなくmpifを使う
mpirun -n 4 hello.out ←実行時オプションとして-nをつける。4の場合は4並列で実行される
Hello world ←4並列で実行したので、結果が4つ出てくる
※某帝国大学はインタラクティブでの実行ができないため実行は省略します
mpif90 -Oss -noparallel hello.f -o hello.out
#include <stdio.h>
int main(int argc, char **argv)
{
printf("Hello world \n");
}
mpicc hello.c -o hello.exe -mcmodel=medium ←コンパイラはgccではなくmpiccを使う
mpirun -n 4 hello.exe
※某帝国大学はインタラクティブでの実行ができないため実行は省略します
これらの例は、コンパイラをMPIのものに変更したことによって「無理やりMPI化」したものであってプログラム自体は通常のソースコードのままである。
これではあんまり意味がないので、次回は「真にMPI的なHello world」を紹介したいと思う。*3
つづく*4



