Hatena::ブログ(Diary)

Endloskette

2014-01-23

BITCOINの費用対効果に関する考察

昨日のクローズアップ現代においてBITCOINが取り上げられていた。BITCOINに関して思うところあるので実に1年ぶりにブログを書く。

BITCOINはサトシ・ナカモトなる人物によって投稿された論文に基づいたピアツーピア型の決済網及び暗号通貨である。

昨日のクロ現においては、BITCOINギャンブル性の高さ、マネーロンダリングや麻薬取引の温床となっている点など、ネガティブな側面を中心に取り上げられていた。

(ただ、番組で取り上げられたことで関心を集め、かえってトラフィックを増大させてしまったWinnyの例もあり、果たして番組制作者の意図が視聴者に伝わったかどうかは不明だが、これはまた別の話。)

番組においては不用意に射幸心をあおることを避けたためか、BITCOINのもっとも肝心な点が報道されていなかった。

それは「計算リソースを対価にBITCOINを得ることができる」という点である。パソコンで計算させ続ければ小遣いが稼げる、ということである。

本記事においては、多くのBITCOINのマイナー(計算を行うことでBITCOINを得る者)が使用しているグラフィックボードであるRADEON HDシリーズを例にとり、もっとも費用対効果に優れたモデルを選出することを目的とする。

f:id:endloskette:20140122233047p:image

図はRADEON HDシリーズのグロスの演算能力(GFLOPS)と、BITCOINの計算における単位である1秒間のハッシュ生成数(Mhash/sec)を比較したものである。

計算においては【スペック一覧】DirectX 11対応GPU仕様一覧表 - PC WatchおよびMining hardware comparison - Bitcoinを使用した。

GFLOPSとMhash/secの傾向はおおむね一致するといえる。また、グラフィックチップの世代ごとのゲーム用APIに対する最適化マイニングにおいてはあまり影響しないと思われる。

f:id:endloskette:20140122233048p:image

図は単位価格あたりの演算能力を比較したものである。価格は1月20日における価格ドットコムの各エディションの最安値を使用した。

ハイエンド向けセグメントとエントリー向けセグメントにおいては値が低く、ミドルレンジにおいては値が高い傾向にある。

これは、ミドルレンジビデオボードが費用対効果において優れたいわゆるスイートスポットであるという、ゲーマーの世界における通説と一致する。

これは、ハイエンド向けが歩留りにより単価が高いこと、エントリー向けがビデオチップそのものよりもボードの生産コストが全体の価格に占める割合が高くなることが要因といえる。

この図においてはRADEON HD 7770GHZ EDITIONが最も費用対効果に優れていることを示している。

ではこの7770を使用した場合、どれだけの日本円が稼げるのか。

1.34Ghash/secで24時間計算した場合の対価を0.001BTC/day(話題のBitcoinを専用ASICで採掘したりアレコレして思ったこととか【コラム】 | TeraDas?テラダス)、1TBCあたり98900円(ビットコイン リアルタイムチャート【価格・相場】)とした場合、1か月あたりの対価は471円。

対して7770の価格は8180円であり、これに加えて24時間計算させるためには電力もかかる。

つまり、現実的に考えてもとは取れないのである。

加えて、現在の計算の主流はグラフィックボードではなく専用のドングルやクラウドを使うことらしい。また、この専用ドングルを個人輸入して転売するほうが儲かるという話もあるようで、「いかなるギャンブルも結局は元締めが最も儲かる」という今更言うまでもない結論に至ったところで本文を締めたいと思う。

2013-03-03 携帯電話買い換えた話

学割を使って携帯電話が契約できる今のうちにすべてのキャリアを契約してしまえ!ってことでDocomoauSoftbankすべて契約するという暴挙に出た。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円)

次にauからiPhone5(16GBホワイト)

http://www.apple.com/jp/iphone/

もはや説明あるまい。iOSアプリが試したかった。ただそれだけ。iPadWifiモデルや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を買ったので、ベンチマークをとってみた。

玄人志向 - 商品一覧 » STANDARD » ケース関連 » 2.5型HDDケース » GW2.5TL-U3/BK

このケース、ドスパラで980円と不安になるぐらいの安さ(今回はポイント使ったのでタダ)であったが、それなりの速度で動いている。

f:id:endloskette:20121119004544j:image

参考のためにeSATAとの比較を行った。ケースはOWL-ELCD35/EU、パソコンがeSATAポートを持たないため、ExpressCard対応ホストアダプタEX34Nを使用した。

Owltech ドライブケース OWL-ELCD35/EUシリーズ ガチャポンパッ!

pw5v-ex34n

USB3.0と比べてかなり遅い結果になってしまったが、どこにボトルネックがあるかは不明。

f:id:endloskette:20121119004543j:image

HDDの生の速度が出てるかどうかはわからないが、USB2.0よりはよっぽど速いということがわかったので今日はこれまで。

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の終了処理を行うサブルーチンです。これを書かなかった場合、誤作動を引き起こすことがありますので必ず記述してください。

コンパイルと実行の例1(某工業大学スパコンの場合)

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の終了処理を行うサブルーチンです。これを書かなかった場合、誤作動を引き起こすことがありますので必ず記述してください。

引数を指定する必要はありません。

コンパイルと実行の例1(某工業大学スパコンの場合)

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

FORTRANプログラムの例

program main

include 'mpif.h'

write(*,*)'Hello MPI'

stop

end

コンパイルと実行の例1(某工業大学スパコンの場合)

mpif90 hello.f -o hello.out -mcmodel=medium ←コンパイラはpgfではなくmpifを使う

mpirun -n 4 hello.out ←実行時オプションとして-nをつける。4の場合は4並列で実行される

Hello world ←4並列で実行したので、結果が4つ出てくる

Hello world

Hello world

Hello world

コンパイルの例2(某帝国大学スパコンの場合)

※某帝国大学インタラクティブでの実行ができないため実行は省略します

mpif90 -Oss -noparallel hello.f -o hello.out


C言語プログラムの例

#include <stdio.h>

int main(int argc, char **argv)

{

printf("Hello world \n");

}

コンパイルと実行の例1(某工業大学スパコンの場合)

mpicc hello.c -o hello.exe -mcmodel=medium ←コンパイラgccではなくmpiccを使う

mpirun -n 4 hello.exe

Hello world

Hello world

Hello world

Hello world

コンパイルの例2(某帝国大学スパコンの場合)

※某帝国大学インタラクティブでの実行ができないため実行は省略します

mpicc -Os -noparallel hello.c -o hello.exe

これらの例は、コンパイラをMPIのものに変更したことによって「無理やりMPI化」したものであってプログラム自体は通常のソースコードのままである。

これではあんまり意味がないので、次回は「真にMPI的なHello world」を紹介したいと思う。*3

つづく*4

*1:あくまでたとえ話なので「そんなこともらわなくても分かるじゃん!」というツッコミは却下される

*2:なお、コンパイルオプションや実行時オプションについては環境に依存しますのでお使いのスーパーコンピュータの管理者にお問い合わせください。

*3:ただし今回の記事についても「MPI時のコンパイル方法と実行方法」については意味はある

*4:かどうかは知らん