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 リ…

OpenGL + CUDA interopのコードを読む

しばらく前に、CUDAを使ってGPU上に作ったデータをそのままGPU上でpixelの配列にしてそのまま画面に描画しようとしていた。 cuda_practice/ising-show at master · ToruNiina/cuda_practice · GitHub 例えばこれなのだが。これは、isingモデルをシミュレーシ…

メモ:cerealと派生クラス2

C++

cerealで継承を使ったサンプルを少し前に掲載したが、これらのクラスがテンプレートだったらどうなるか。特に、継承関係を登録するマクロ。 この部分だ。 CEREAL_REGISTER_TYPE(sample::Derived) CEREAL_REGISTER_POLYMORPHIC_RELATION(sample::Base, sample…

メモ:cerealと派生クラス

メモです。cerealは説明不要のシリアライズ用ライブラリ。 派生クラスをstd::unique_ptr<Base>として持っている時の最小サンプル。 cereal::base_class<Base>(this)をシリアライズするのを忘れない CEREAL_REGISTER_TYPE(sample::Derived)を名前空間の外に書く。セミコロ</base></base>…

parallel linear BVH (LBVH) をCUDA+thrustで書いた

久々に少し非自明なことをCUDA+thrustでやった。大体動くようになるまでまる一日(半日+半日なので別のmetricsでは2日)かかった。 github.com BVHとはなんぞやという話は、以下の記事にとてもよくまとまっている。というか、多分この記事の著者は私のような…

toml11 v3.0.0リリース

毎回思うんだけどどういうタイミングでリリースタグ打てばいいのかよくわからない。皆どうしてるんだろう。 github.com 基本的に前回記事を書いた時からそんなに変わっていない。一応自分で使ってみて気になった細かなことがいくつかあるが(例えばカスタム…

toml11 v3ができてきた

以前「やりたいな〜」と書いた通りの変更をゴリっと入れてみた。まだマージしていないが、v3ブランチがpushされている。今まで通していたテストは全て通った。追加機能のテストも最低限は通った。しばらくテストの拡充をしてからベータ版を出すつもりでいる…