atcoderに参加してみた

ABC167と168に出た。両方4完でパフォーマンスはギリ水(1293)と緑(1091)。今回下がったのはCでWAしまくったからだろう。ロジックにミスが見当たらなかったので誤差の扱いが雑だったっぽい。まだどういうケースで落ちてたのか見つけられていない。提出したコー…

個人サイトを作った

なんかそういうのがあったほうがいいのかなと思って作りました。多分数年前にもちょっとやろうとして放置していたと思う。 toruniina.github.io 将来への不安に苛まれてる時の方がこういうのをやったほうがいいのかなという気持ちになる。 一応Blog的にも使…

AtCoderに登録してみた

男もすなる競プロといふものを女もしてみむとてすなり(女ではない)。そもそも出場していないので「すなり」とか言ってるけど実際にはしてすらいない。 年明けに「今年はもう少し色々記事を書くぞ」とか言っときながら書類とセミナー発表とゲームと書類と書…

コア数が多いマシンが手に入ったのでslurmで計算クラスターにする

slurmはオープンソースのジョブスケジューラーだ。 これは何かというと、例えば、俺は今から1000種類の条件でシミュレーションを投げるぞ! ウオオ という時に、サーバーにログインして、シェルのfor文で1000個のバッチスクリプトを登録し、そのままログアウト…

trailing comma問題

C++

別名ケツカンマ問題。 最後の要素の後にはカンマを入れてはいけない、という場合にどう対処するか。 要素のインデックスやイテレータを使ってループしているなら、普通にそれを見ればいい。 std::cout << "["; for(std::size_t i=0; i

static variableの初期化順序

C++

template structの中にstaticなstd::mapを作ってmain()よりも前にアクセスしたらその時点ではまだコンストラクタが呼ばれておらず、中身がゼロ埋めされていてセグフォになった。 静的変数の初期化順序は基本的に書いた順、翻訳単位が違ったら実装定義、実装…

std::variantと不動点演算子

C++

実は、std::vectorはC++17から不完全型をサポートしたので、std::variantと組み合わせると以下のようなコードが書ける。 struct config_t { std::variant<bool, int, double, std::string, std::vector<config_t>> data; }; これを上手く使えばJSONなどの木構造をかなり簡単に(ポインタを陽に触らずに)扱える。std</bool,>…

アセンブリ解読:Fortran配列の中身

前回の続きです。 以下のコードを-O3でコンパイルすると、 pure function nth(v, n) result(out) implicit none integer, intent(in) :: v(:) integer, intent(in) :: n integer :: out out = v(n) return end function nth こんなアセンブリになって驚いた…

x64で配列の添字にintを使うと遅い

こういうツイートを見た。気になったので試してみたら本当にそうらしい。 x64でEAXに値を入れるとRAXの上位は(符号拡張ではなく)0になる。なのでC/C++で配列の添え字に32bit整数を使うと符号拡張命令が追加されて遅くなる。LP64環境で配列の添え字にintを使…

thrustのバグを見つけて直した話

thrustがasync対応していたのを先月見つけた。 in-neuro.hatenablog.com ドキュメントがまるで書かれていないところをコードを読み進めて試していたのだが、そこで不可解な動作を発見した。 以下のようなコードを書いたとする。thrustの関数を非同期に読んで…

tomlの複数行文字列内でのクオートの取り扱いに関するエッジケース

何が起きたのか TOML規格レポジトリにこの記事のタイトルの通りのアップデートがあった。 github.com 基本的に、toml11ではTOMLのmasterブランチに入った変更は TOML11_USE_UNRELEASED_FEATURES を define しないと有効にならないようにしている。だがこの手…

TravisでOpenMPは使える

使えるみたいです。ただしOMP_NUM_THREADSを小さめの値、4とか、にしておかないといけないらしい。というのも、VMを動かしているハードのコア数(めちゃくちゃ多いんだと思う)を取得するからだそうで。CIに投げてる全員がそんな数のスレッドを立ち上げたら…

OpenMPの挙動を見る

少し前、ちょっと面白い挙動に出くわしたので、順を追って説明しておこうと思った。知ってる人には当たり前のことが書かれているので下の方まで飛ばしてくれても構わない。 OpenMPはプラグマを書くだけでメモリ共有並列化ができるというやつで、手をつけやす…

CMake 3.16でprecompiled headerがサポートされていた

CMakeの最新バージョン、3.16でtarget_precompile_headerがサポートされていた。ドキュメントは以下の通り。 cmake.org precompiled headerは、大規模なプロジェクトなどで変更がないのに様々な.cppファイルから何回もインクルードされるヘッダーファイルを…

-ffinite-math-onlyでも動くNaN/infチェック

以前こういう記事を書いた。 in-neuro.hatenablog.com まあNaNじゃないことを仮定しての高速化なんだからstd::isnan(x)を常にfalseだと思ってdead code eliminationするのは当たり前じゃんという気はするが、備忘録的に。 とはいえ、コンパイルオプションに-…

nvccのホスト用コンパイラも意識すべき

nvccはホスト(CPU)側のコードを生成するのはホスト用のコンパイラ(gccとか)に任せており、これは--compiler-binder <path>で指定できる。 以下nvcc --helpから抜粋。 --compiler-bindir <path> (-ccbin) Specify the directory in which the host compiler executabl</path></path>…

thrustにasyncサポートが入っていた

thrustというライブラリがある。 thrust.github.io 直接使ったことがなくても、CUDAをインストールしたら付いてくるので知らずにインストールしている人は多いと思う。 これはCUDAをC++で使う上で最高レベルに便利なライブラリで、もはやこれ無しでCUDAプロ…

2019年にやったこと

多分細々したことをもうちょっとやってるけど忘れた。 書いてない部分で去年書き上げた論文のためのデータ集めとか研究用ソフトの開発とか解析とか先行研究調査とか論文執筆をしてる。一つは同僚と一緒に(co-1st)、一つは一人で。開発を研究の隙間でやってい…

rsqrtの精度とレイトレの不審なアーティフアクト

だいぶ前(前の冬なので半年以上前)に、Ray tracing in one weekendを読みながらRustでレイトレを実装していたのだが、そこでrsqrtを使ったら画像が変になったのを思い出した。理由は今も(ちゃんと調べていないので)よくわかっていないが、とりあえず思い…

TOMLで型の異なる要素を持つ配列が許可された

起きたこと TOML v0.5.0までは、配列に異なる型の要素を混ぜるのは許可されていなかった。 array = [1, 2, 3] # OK invalid1 = [1, "foo", 2019-11-08] # error invalid2 = [1, 2, 3.14, 4, 5] # error が、混ぜたいという人がかなり多く、ずっと議論が続い…

toml11をマイナーアップデートした

しばらく前だが、アップデートした。最新バージョンはv3.1.0だ。 Added TOML11_USE_UNRELEASED_TOML_FEATURES TOML言語仕様はまだちょいちょいバージョンアップされている。なので「TOMLとしてリリースされていないがtoml-lang/toml:masterにmergeされた、お…

ドキュメントは何で書けば良いのか

今までドキュメントは適当なMarkdownで書いてそれを適当にGitBookでウェブサイトに変換していた。だがGitBookはコマンドラインツールの開発をやめてしまっている。なのでGitBook公式のホスティングサービスに移行するか、何か代替品を探さなければならない。…

インデントのスタイルについて

C++

そういえば、自分のインデントスタイルについて人に話すことってないなと思ったので。 インデントやコードのスタイルは初心者には軽視されがちだ。なぜならそれは「本質ではない」からだ。どんなコーディングスタイルでも動くものは動く。コンパイラにとって…

入力に応じてテンプレート引数を変える

C++

C++は静的に型付けを行うので、基本的に実行時に型を切り替えることはできない。なので、入力に応じて異なる型を返すことはできない。だが継承を使っているなら、常に基底クラスへのポインタを返しつつ、入力に応じて派生クラスのテンプレート引数を変更する…

言語間の速度差について

全く同じアルゴリズムを似たようなスキルの人が書いても、使った言語によって速度差が出る。 たとえばガベージコレクタが一瞬実行を停止させてしまったり、配列の境界チェックが必ず行われたり、ネイティブコードにコンパイルされなかったり、そもそもの処理…

-OfastはNaNチェックを無効化する

C C++

gccには-Ofastというオプションが存在する。これは、標準規格への適合性を犠牲にしてでも高速なバイナリを吐くモードだ。色々なことが犠牲になるが、NaNチェックも犠牲になる。 以下のコードを見て欲しい。 wandbox.org #include <iostream> #include <cassert> #include <cmath> int m</cmath></cassert></iostream>…

gitbookのmathjaxプラグインが突如動かなくなる

どうやら昨日mathjaxがメジャーバージョンアップ(v3.0.0)したらしい。リリースノートによると、中身がモダンなテクニックを使って全て書きなおされているようだ。 This version is a complete rewrite of MathJax from the ground up using modern program…

templateクラスを継承するtemplateクラスのデストラクタをoverrideし、かつdefault指定してextern templateでビルドするとintel compiler (v18)だけlink errorになる

C++

タイトルが長い。 でもこれ以上何かを削ると不正確なタイトルになる。もしかするともう少し条件を広げても同じエラーが出るかも知れないが。 extern templateというのがあり、以下の記事に詳しい。 qiita.com かい摘んで説明しておこう。ヘッダファイルでext…

TOMLで浮動小数点数の指数部分でleading zeroが許可される

github.com これがTOMLの作者(Tom Preston-Werner)の手によってマージされていた。一応masterブランチにマージされてもリリースまでにrevertされる可能性はあるとはいえ、それなりの確率でTOML 1.0.0でリリースされると思われる。 この変更で、以下のよう…

BOOST_ROOTが無視される

今までBoostは1.58~1.69までしかインストールしていなかったのだが、今日1.71をビルドしてインストールした。そしてこれにハマってCMakeCacheやbuild/ディレクトリを消してはCMakeを実行しなおすことを繰り返して10分くらい時間を無駄にした。 github.com リ…