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

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

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,楽しみ倒しました.ありがとうございます.
来年も是非参加したいと思います!!


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


YAPC::Asia Tokyo 2014でPerl::Lintについて喋りました

タイトルのとおりです.
スライドは以下です.



もうちょい詳しく話す予定だったんですが,冒頭のライブリリースに失敗するなどして出鼻をくじかれテンパってしまいました……
ちょっと詳しい話をすると,

  • ポリシー周り
    • 各ポリシーがトークンを受け取って,それを各々独自に走査して処理する
    • ポリシーはevaluate()というメソッドを持っていて,そこで解析処理をする.各ポリシーのevaluate()はそれぞれ同じ引数を受け取り,violationsを含むarray referenceを返す.ゆるふわなインターフェイス的思想.
  • フィルターもゆるふわなインターフェイス的思想になってて,filter()というメソッドを持ち,filterしたいポリシー名を含んだarray referenceを返す.
  • こんな感じで,新しいポリシーやフィルターを作りやすい!! と思ってたんだけどそうでもない気がする,後述.
  • とりあえず,開発のモチベーションとして,処理が高速でないと話にならんと思ったのでパフォーマンスの為にあえてダーティなコードを書いている部分がある
  • 一方でパフォーマンスとは関係の無いダーティなコードも書いている
  • あとまあ,Perl::Lintが速い場合と遅い場合があるのはわかっていて,スライドには割と恣意的なベンチの結果を載せている


あと,現状だと独自のポリシーとか独自のフィルターを書く為の敷居が高過ぎる (例えば,作法とかが一切わからん) という意見をもらったので,そこら辺を上手くサポート(チュートリアルとかスケルトンジェネレータとかで)したいなあというモチベーションになりました.何か良い意見あれば是非教えて下さい!


質疑応答は(覚えている限り)以下のとおりです.

Q. なんでAST使わないの?
A. Compiler::Parserがまだ不安定で,解釈できないコードが多かったため諦めた

Q. ASTじゃなくてToken使うことによるメリットってあるの?
A. よくわからない,無いのでは.手でToken走査して頑張るの本当に大変.ASTあるなら本当に使いたいケースは確かにある.

Q. Compiler::Lexer,SEGVとか多いイメージあるけど最近どう?
A. 最近では少なくなっているとは思います.でもまあ起きるには起きるんで……

Q. コントリビュータ募集って言ってたけど,どのへんに協力して欲しいの?
A. ぶっちゃけ僕が実装したくないポリシーを実装して欲しいんですけど,まあ無理な話なんでドキュメントとかで協力していただきたく存じます.

Q. Perl::LintにPerl::LintかけるとたくさんPerl::Lintのviolation出るけどこれって直るの?
A. 無理では……(ほんとうに難しい)

Q. C-Style forやめたら?
A. C-Style forの方が楽なんで許して欲しい (これは発表中にも喋ったんですけど,トークンの先読みとか後戻りとかを結構するので自在にインデックスをいじれたほうが良い)



YAPC会期中は常に会場のどこかしらにいますんで,何かPerl::Lint周りに興味がある方いらっしゃいましたらお話しましょう!

YAPC::Asia Tokyo 2014でPerl::Lintについて喋ったりします

おわび

Perl::Lint出来てません

本題

明日8月28日(木)から3日間に渡ってアジア最大のPerlのカンファレンスであるところのYAPC::Asia Tokyo 2014が開催されますね! 楽しみですね! 夜も眠れないですね!


さて,そのYAPC::AsiaでわたくしPerl::Lintという開発中のツールについて一席打たせて頂きます.
Perl::Lint - Yet Another Perl Source Code Linter - YAPC::Asia Tokyo 2014

  • そもそも静的解析とは何か
  • 静的解析して何が嬉しいのか
  • Perlにおける静的解析ってぶっちゃけどーなのか
  • Perl::Lintの構造とかポリシーとか実装とかってどうなってんのか
  • Perl::Lintにたっぷり詰まってるバッドノウハウについて
  • 理想の社会とは何か

みたいな話をする予定です.「Perl::Lintの話」と銘打ちましたが,コードの静的解析技術やその応用について言及する予定です.
どっこいあくまで予定です.まだ資料できてません.
資料できてませんが,必ず良い発表にするので皆さん是非足を運んでいただけたらと存じます.


資料できてないしPerl::Lintもできてないしで,別の意味で夜も眠れませんが,俺のこの熱量は本物です.
それではみなさん会場でお会いしましょう!!!!!!!

OS Xのクリップボードとtmuxのクリップボードを共通化する

OS Xクリップボードとtmuxのクリップボード *1 を共通にする設定に関するメモです.
なお,tmuxのバージョンは1.9a,reattach-to-user-namespaceのバージョンは2.3です.

1. まずreattach-to-user-namespace入れる
$ brew install reattach-to-user-namespace

簡単.

2. 設定ファイルを書く

.tmux.confに設定を書く.

if-shell 'test "$(uname -s)" = Darwin && which reattach-to-user-namespace > /dev/null 2>&1' 'source-file ~/.tmux-reattach-to-user-namespace.conf'

if-shell使うと,第一引数がtrueの時だけ第二引数を実行してくれて便利.
上記の設定では,「OSがDarwin,つまりOS X」かつ「reattach-to-user-namespaceがパス通ってるところに置いてある」時だけ,~/.tmux-reattach-to-user-namespace.confを読みに行くという感じになっています.


で,.tmux-reattach-to-user-namespace.confを書く.

set-option -g default-command "exec reattach-to-user-namespace -l $SHELL"

unbind -t vi-copy Enter
bind -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"

unbind ]
bind ] run-shell "reattach-to-user-namespace pbpaste | tmux load-buffer - && tmux paste-buffer"

reattach-to-user-namespace経由でシェルを起動することで,tmux上でもpbcopypbpasteを正常に使える状態にしておき,あとはキーバインドをオーバーライドして,コピー時は内容をOSのクリップボードに送り,ペースト時はOSのクリップボードから読み込んでくるようにすればOK.


別に.tmux.confに書いても良いとは思うんですけど,.tmux.confif-shell1発書いて「こういう条件の時にこの外部設定ファイル読み込むんですよ〜」と表明したほうがわかりやすい気がしてこうした次第.気分です.

結論

if-shellは便利

*1:クリップボードと言うのだろうか

XSのABRTをキャッチしたい





以下の様なコードを実行するとABRTしてアプリごと死ぬという厳しい状況にぶち当たりました.
(なおこのバグはfix issue #45 · 93ff36f · goccy/p5-Compiler-Lexer · GitHubにて修正されている様子.@さんには頭が上がりません.ありがとうございます)


$SIG{ABRT} = sub {...};

という具合で書いてやればABRTを握れるのかな〜とか思って書いてみたら,この方法ではシグナルをトラップできない感じだったので,やむなく以下の様にforkを使ってなんとかすることにしました.
https://github.com/moznion/Perl-Lint-Playground/blob/5d9c23b59646dcc65fbb8d95e67368f6b02c3c01/lib/Perl/Lint/Playground/Service/Lint.pm

IO::Pipe便利!!!!!


さて皆さんこういう感じで,入力によってはXSがエラー吐いてどうにもならん時ってどうされてるんですかね?

Published “Perl::Lint Playground”

(またしても日本語は下にあります / Japanese follows English)


I published “Perl::Lint Playground”.
http://perl-lint.moznion.net/


You can try feature of Perl::Lint easier on this playground.
However this and Perl::Lint have not been completed yet, so possibly results are vague.
(e.g. Now, source code that was written in this playground is not file in spite of playground warns by policy of file path. I think there is more problems...)


For now, please play here and tell me your mind.
Enjoy!




Perl::Lint Playgroundを公開しました.
http://perl-lint.moznion.net/


ブラウザ上でPerl::Lintを試してみることができます.
まあ,みなさんもご存知の通りPerl::Lintは未完成ですので,このプレイグラウンドの結果もあんま信用しないほうが良いです.
(例えば,プレイグラウンドで試す為のソースコードはファイルではありませんが,現状ではファイルにまつわるポリシーによって警告されるなどといった問題があります.多分他にも結構あるとおもいます)


とりあえず遊んでみて,僕にフィードバックなどをくれると嬉しいです.
よろしくお願いします.