blog青子守歌のブログこの広告は、90日以上更新していないブログに表示しています。生成項)が出てくるのですが、色々なところの「MPS法実装してみました!」記事を見てみるとこのポアソン方程式の特に境界条件の扱い方が間違っているのが散見される(&よく「なんか上手く動かないんだけどどうしたらいい?」と聞かれる)ので、まとめておきます(別に新規性のあることじゃないし)。OpenCLやる前にSIMD使い切れっていう幻想d.hatena.ne.jpなんだか知らない間にぜんっぜん関係ないtweetを拾われて勝手に憤られてた上に、全然まともに計算していないもの*1を出されてたので、ちゃんと動くようにして測りなおしました。Studioのバージョンだけ違います(System.Numerics.Vectorsが必要ですが、4.1.0を使ってます)。C#(なにもしない)5.5秒ぐらいC#(System.Numerics.Vector<double>)4.5秒ぐらいということで、1秒ぐらい縮まりました。FX-8350だとSIMD幅が128bitと判定されてSystem.Numerics.Vector<double>.Countが2になっていました(※先の記事の通りAVX2を使えば256bitできます)。2倍弱ぐらいは期待したのですが、結果は1.2倍で、ちょっと微妙な感じです。関数呼び出しのコストがこんなに取られてるのか・・・よく分かりません。私は最近まともなC#を書けてないので、まともなC#erさんに解明を期待します。11:30)すいません、昨日眠い状態でコード書いてたので、最後にコミットせずにpushして安心して寝てしまってました・・・。昨日の時点ではSystem.Numerics.Vector<double>を使っても全然速くないどころか遅かったと思います。正しいのはさっきコミットしました。これで、4.5秒ぐらい(x1.2ぐらい)です。12:30)構造体もちゃんとサイズを切り分けたら、速くなりました。C#(なにもしない)5.5秒ぐらいC#(System.Numerics.Vector<double>)2.5秒ぐらいなぜか2倍以上出ている・・・?まぁとりあえず速くなったので良しとします。これが一番早いと思います(フラグ)。私の環境ではSIMD長=4に処理が飛んできたので、structでラップしないでナマのVector<double>の配列で試してみました。100msほど縮んだだけですね。SIMDになってくれました。C#(なにもしない)5.5秒ぐらいC#(System.Numerics.Vector<double>)2.2秒ぐらいCPUが違うので単純比較できませんが・・・。実行可能ファイルも置いておくので、もしお時間のある方は、OSとCPUの情報を添えて、実行時間とSIMD長を教えてくれると嬉しいです。requestもらってました。全部は取り込みませんでしたが、一部を取り込んだところ、以下のようになりました。C#(なにもしない)5.5秒ぐらいC#(System.Numerics.Vector<double>)2.5秒ぐらいC#(今回)1.3秒ぐらい以前の記事でC++のSIMD(AVX2)が1.3秒ぐらいだったので、同等ぐらいには速くなったようです。使い方に工夫が要るのかもしれませんが、C++と同じぐらいの性能がでるのであれば、C#にはアライン考えなくていいCPUに合わせて勝手にSIMD長変えてくれる(逆にこれは欠点でもある?)最初から演算子がオーバーロードされてるのでintrinsic書かなくていいという長所が3点あります。積極的に使えるタイミングでは使っていきたいところですね。aokomoriuta.hateblo.jpを使って測ってみました。ソースコードも前と同じ場所にあります。普通にmakeすれば動くはずです。8GBx2FuryXの方が10[ms]ですが速いですね!!・・・誤差な気がする。最適化もなにもしてないからなぁという気はしますが。aokomoriuta.hateblo.jpをちょっと修正してCPUで動かすようにしたので、手元にあった環境で動かしてみました。1.2OpenMPより倍速いだって・・・!?なんか信じられないのでもうちょっと調べてみるけどあり得るのか・・・。「gccのOpenMPが裏でpthreadを使っていて、OpenCLはTBBを使っていて、つまりpthreadよりTBBが速いのでは?」と言われたので、純AMD環境でVisualStudioでやってみました。1.21スレッド版が激遅なのはなんなのかって感じですがOpenCL版は更に速かったです。うーん・・・なんなんでしょう。SDKのOpenCLをCPUで動かしたらOpenMPより倍速い?Tweet広告を非表示にするもっと読むコメントを書く2015-05-09白か黒か、認識に性差は本当にあるのか?この話。8本当か?そもそもとしてそんな性差があると私は聞いたことがないです(自分で言っておきながら)。完全なる創作です(創作目的は後述)。それはそれとして、いっぱいreplyやらmentionやらRTやら受けて、このまま「あー面白かった」で終わらせてももったいないので、せっかくなので統計とってみました。結果は(A)男性は「黒-白」、女性は「白-黒だった!」と、つまり逆だったと言う人のほうが多かった(B)ただし、全体としては、左が白で右が黒と言っている人が多かったでした。詳しく言うとこういう話はなんでも大体「逆だった!」と言う発言の方が多く、逆に「その通りだった」と言う人はあまり発言しないものです*1。感覚的にも違うほうが面白いしネタになりやすいですからね。これが結果(A)の理由だろうと思います。(B)については、単純に取得したデータ全体でと、性別不明だった人で、白-黒だと言っている人の方が多いかったです。Twitterユーザー全体の男性の方が多いという結果があるにも関わらず、今回取得したデータは女性からの発言に偏っていました。男女比と(A)の理由と合わせると、男だろうと女だろうと白-黒と認識しているという結果(B)の事実があり、その結果、逆だった女性のほうが多く発言しており(ユーザー比率は小さいにもかかわらず)、tweetの通りだった男性の方はあまり発言しなかった(ユーザー比率は大きいのに)、ということになったんじゃないでしょうか。いうことでここでは白か黒かの認識に性差は関係ない(左が白で右が黒だという人のほうが多い)と結論づけます。spreadsheetで見れます。odsも置いておくので、データを追加したかったり色々したい人はここからダウンロードして下さい。若干話題に乗り遅れた感ありますが。d.hatena.ne.jpけど、SSEも知らねー、SIMDも知らねー、なんか俺が書いたアルゴリズム遅いけどとりあえずOpenCLとかで高速化しよっかなーとかね、甘ったれてんじゃねえよ。CPUをもっと使いきれよ。お前のアオいコードのせいでCPUが泣いてるよ。GPGPUなんてのはSIMDを使い切った後の話でしょ。GPGPUするのにGPUのパワーとメモリが足りませんとか言う前にまずSIMDからだろ。言われてたので、検証することにした(やっつけ)。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。