その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

今週金曜日はテンプレートエンジンNightです

今週金曜日 (10月12日) はテンプレートエンジンNightです!!


テンプレートエンジンNight on Zusaar

多くのテンプレートエンジン関連の発表が目白押しとなっております.
各位におかれましてはふるってご参加いただきたく存じます.

参加可能枠を拡張いたしましたので,「人が多すぎて参加できなさそうだワ!」という方でもご参加頂けるようになったのでは無いかと思います!!!


それでは当日お会いしましょう!

PHPでお手軽にベンチマークを取るためのツール BenchMarker を書いた

php

PerlにはBenchmark.pmというお手軽にベンチマークを取るためのライブラリがあって,これがまあ便利なわけです.
そこで,深い事情により最近書いているPHPにもこういうツールがあると便利だろうなーってことで書いたのがこのBenchMarkerになります.

moznion/BenchMarker · GitHub
moznion/benchmarker - Packagist

ノリと勢いでPackagistにもアップロードしましたのでお手軽にご利用いただけます.


使い方ですが,cmpThese()を例に取ると,

<?php
$code = function () use ($foo) {
    // do something
};

$benchmarker = new \Moznion\Benchmarker();
$benchmarker->cmpThese(10000, [
    "code A" => function () {
        // do something
    },
    "code B" => $code, // callableな変数も渡せる
]);

という風に,無名関数を渡してやると,

           Rate  code A  code B
code A  22571/s      --    -49%
code B  44656/s     98%      --

という感じで,各々のコードを10000回試行した比較結果がわかりやすい出力されて便利!!! という勢いです.


ほぼほぼPerlのBenchmark.pmからパクってきたので,知ってる人ならサクッと使えるのではないかという感じです.
詳しくはBenchMarkerのドキュメントかBenchmark.pmのドキュメントなんかを参照してくださいませ.

Goでforkしたいとかgoroutine IDが欲しいとか言わない















結論

欲しがらない

補足






CUDAのエラーチェックを楽にする

CUDAの組み込み関数はほとんどcudaError_tというエラーコードのenumの値を返してくるので,これを適宜見てエラー処理をする必要があります.最近ではそこまででもないですが,CUDAの組み込み関数はカジュアルにエラーを吐くのでちゃんと見てやらなければならない.
見てやると言っても,CUDAの組み込み関数がエラーを吐いてきたらほとんどの場合そのまま潔く死んで欲しいので (個人の意見),以下の様に戻り値をチェックしてexit()するというコードを大量に書くことになります.

int *foo;
cudaError_t err;
err = cudaMalloc((void **)&foo, sizeof(int) * 42);
if (err != cudaSuccess) {
    exit(err);
}
...

まあ,素直に書けばええやん! という意見は尤もなのですが,いかんせんこういうエラーチェックが大量に入ると本質的なコードが追いにくくなってつらい.
あとカジュアルにエラーチェックを忘れてしまって,バグッた時にハマる (しかしまあ,これはもうどうしようもない気がしている).golangとかだと,返ってきたerrが使われてないと「err使われてないよ! (つまりエラー処理してないんじゃねえの!)」と処理系が叱ってくれるからナイスですね.羨ましい.あとgolangは「エラーを受け取っても受け取らなくても良いよ」みたいなものが無いから,そこら辺のコードを規約化出来て良いという印象があります.


さて,そうしたリッチな機構が無い上でどうするかというと,僕は以下の様なマクロを書いてしのいでいます.

でもって,こう書く

int *foo;
CUDA_SAFE_CALL( cudaMalloc((void **)&foo, sizeof(int) * 42) );

こうしておくと,CUDA組み込み関数からエラーが吐かれた時にエラーメッセージ・ファイル名・行番号と共に,エラーコードでexit()してくれるのでまあまあ便利.
ちなみにcudaGetErrorString()っていう関数はcudaError_tの値をもとにエラーメッセージを引っ張ってきてくれる君です.


しかし,これも野蛮な方法であることには違いないし (なにより,CUDAの組み込み関数がCUDA_SAFE_CALLに渡される事が保証されない),エラーチェックが忘れがちになってしまうという問題については何一つ解決されていません.
現段階では,ちょっとだけコードが見やすくなって便利,くらいの感覚です.


もっと良い方法知ってる人いたら是非教えて下さい.

テンプレートエンジンNightやります

ページャNightなるイベントが開催されてからはや2ヶ月,
あの「なんとかNight」が帰ってきた!!!!



テンプレートエンジンNight on Zusaar


今回はテンプレートエンジンNightです.その名の通りテンプレートエンジンとその周辺技術専門の勉強会です.
テンプレートエンジン尽くしの2時間となる予定ですので,テンプレートエンジンに興味のある方は是非ふるってご参加下さい.

予定ですと,

といった,たくさんの言語のテンプレートエンジンエンジンの話が聞ける予定です.
めちゃめちゃ楽しみです!!!


よろしくお願いします.

CUDAで特定の条件に合致したGPUのIDを持ってきたい

CUDAで,特にマルチGPUプログラミングなどをやっておりますと,特定の条件に合致したGPUのIDを持ってきたいという要求に高確率でぶち当たる事となると存じます.俺はぶち当たる.


GPUマザーボードに5枚刺さっていて,そのうち4枚は映像のアウトプット端子がないGPGPU専用の板で,残る1枚は映像を出力するためだけの貧弱なボード,という構成のサーバはこの世の中少なくありません *1
そうした構成の時に,不慮の事故によりcudaSetDevice()によってGPGPU専用のグラボではなく映像出力専用の貧弱な板がアサインされてしまったばかりにパフォーマンスが死ぬほど落ちて死ぬ,というのは割とよくある事例であります.そうした事故は未然に防がなくてはなりません.


原因を考えてみましょう.
なぜこういう悲しい事故が起こるかと言うと,cudaSetDevice()に食べさせるGPU IDをハードコードしているからこういう事が起こるわけです.
GPUのIDはハードウェアの構成が変わるとそれと共に変化します (あと良くわからんけどこの前マシンをリブートしたらIDが変わってハマった,ふざけんな).
つまり,書いたプログラムを違う環境に持って行くと動かなくなったりパフォーマンスが下がる可能性が出てくるわけですね.
GPU IDをハードコードしてはならない.


で,どうするかと言うと,

こういう感じのプログラムを書くことで解決を試みています.
cudaGetDeviceCount()GPUボードの数を持ってきて,それをもとに全部のGPUボードを舐めつつcudaGetDeviceProperties()GPUのプロパティを引き出し,そのプロパティのデータを使って条件と一致するボードかどうか (今回はボードの名前) を見てやるという感じですね.
基本的にcudaGetDeviceProperties()で取れるcudaDeviceProp構造体はボードのほとんどの情報を持ってるので,これを使えば大体なんとかなります.


こういう感じで持ってきたIDをcudaSetDevice()に渡してやると事故が起きなくて便利.

追記

つらい

*1:とは言え,「GPUなのに映像出力できないとはけしからん!!」と怒る怖い人がいるので,最近ではGPGPU専用の板でも映像を出力できたりします

YAPC::Asia Tokyo 2014に参加致しました

YAPC::Asia Tokyo 2014に参加致しました.

例年はgihyo.jpのリポータという事で参加していたのですが,今年は僕の怠慢でリポータではなく,初の一般参加でした.

とはいえ,
YAPC::Asia Tokyo 2014でPerl::Lintについて喋りました - その手の平は尻もつかめるさ
に書いたように発表はしたのですが,各方面から「慢談だ,慢談だ」などと揶揄され非常に厳しい状況です.慢談じゃねえっつってんだろ!!!
汚名をすすぐ為に後ほど詳しい解説記事を書く予定です.乞うご期待.


ああ,そうそう,@さんのライブコーディングの茶々入れ係もやりました.
トラブルはありながらも適切に説明を入れながら,時間通りに成果物を完成させてしまうsongmuさんは完全にバケモノだと思いました.
ところで,まじめにライブコーディングやってる人に茶々を入れるの,実は皆さんが思っているより200倍は難しくて,「ここで変なこと言って邪魔したら殺されるんじゃねえか……」という葛藤が常に頭にあったことを述懐します.しかし常に会場がシーンとしているのも怖い……喋らねば! みたいな感じでおっかなびっくりしゃべっていたというのが舞台裏です!!


さて,はじめて一般目線でYAPCに参加しましたが,好きなときに好きなトークを見て,おしゃべりしたい人とおしゃべりできる,というのは本当に良いですね.今年のトークの方はPerl関連のトークと非Perlのトークが半々くらいで,バラエティに富んでて非常に面白かったように感じます.

特に@cho45さんのトークは今年見たトークの中で最高のトークでした.これが本物のハッカーなのだ,と実感しました.ローレイヤーでブログツールを書くという発想がすさまじい.本当に格好いい.

@lestrratさんのSubroutine Signaturesのトークもめちゃめちゃ面白かった.現実はドラマよりもドラマだったし,OSSは人間そのものだという事を改めて実感できました.人間としてのパワーを高めたい.

そして静的解析友達でもある@hitode909さんのトークは,今回の僕のトークと同じ感じのテーマ性を有していたので非常に楽しみにしていて,果たしてそのトークは本当に良かったです.頑張って静的解析するぞ!!!!!


さてさて,今回のYAPCで特筆すべきは今年から導入された同時通訳で,これがとにかく凄い.
こういうカンファレンスで提供される同時通訳と言えば,あまりクオリティが高くなくて,聞いてるうちにその通訳音声がノイズになってきて「だったら自分の耳で聞くわい!!!」ってなってインカムを外す,というのがお決まりのパターンだったわけで.
そんな感じで本当に失礼なことに,YAPCの同時通訳に関しても最初は全く期待していませんでした.
そして蓋をあけるとびっくり仰天,なんと快適な同時通訳! 今まで体験した同時通訳の中で最高の通訳でした.本当にありがとうございます.

例年は海外からのスピーカーのトークは聞きに来る人が少なくてなんだか寂しい思いをしていたのですが,今回は同時通訳のパワーのお陰か聴講者の数が多くて良い感じでした.やはりなんだかんだ言っても言語が違うというハードルは確かにそこに存在するので,このような障壁を少しでも取り除こうとする取り組みは本当に素晴らしいですね.最高です.
かなりのコストがかかっている事と存じますが,来年以降も同時通訳はぜひとも続けていただきたく思います.


そしてインターネット!
我々はインターネットが無いと窒息して死んでしまう民族なわけですが,今回の会場内のWi-Fiは何一つ不自由すること無く,快適なインターネットライフを送ることが出来ました.これが有志の皆さんの力で成り立ってるというのだからすさまじい.マジ最高!! ありがとうございます.


後,無限コーヒーや無限かき氷といった炊き出し制度もかなり良かったです.
ああいう食物や飲料が存在しているとどこからともなく自然と人がわらわらと集まってくるので,そこで自然とコミュニケーションが生まれて色々おもしろ体験が出来て良い.僕はといえばその無限コーヒーの傍らでBooking.comの人事の人と適当な英語で魂のコミュニケーションを行い,Booking.comのロゴが入ったスクィーズボトルを貰うにまでこぎつけました.「そのボトルあげたんだから雇うぞ」とか言われた気がするけど多分気のせいだ.
そういった場所でおもしろイベントを催すっていうのも,「これぞ祭りじゃ!!」という気分が盛り上がって非常に良かった.


会場内にHUBがあるというのは非常に考えものですね!! 僕みたいに自制心の無い人間はホイホイおびき寄せられてしまう!
とは言えこういう社交場というか,コミュニケーションの場があるのは本当に素晴らしい.普段話せないような色々な人と楽しく話せて本当に良かった.
酔っ払った勢いでBooking.comの皆さんと喋ってたら「雇うぞ」とか言われた気がするけど多分気のせいだ.


とにかく今年のYAPC,楽しみ倒しました.ありがとうございます.
来年も是非参加したいと思います!!


最後にひと言
適当な英語でも通じる!!!!!!!!!!!!!