[C++][ADAPT]データ分析、処理ライブラリADAPTの更新情報(2)。

ADAPTの更新情報である。本ライブラリを私個人も研究の中で本格的に導入し、その都度欲しくなった機能の追加などを行ってきたので、そのまとめだ。

ADAPTについての説明はこちらへ。
ADAPTのGitHubリポジトリはこちらへ。

条件指定可能な階層関数の追加

ADAPTはgreatest(population / area)のように下層要素を集計した結果を返す階層関数を用意している1ExcelのSUM、MAX関数などに似た機能である。ここにsum_ifgreatest_ifのような条件指定可能な関数を用意した。例えばgreatest_if(population / area, area < 100)としたとき、area < 100を満たすものだけを対象にpopulation / areaの最大値を求めその値を返す。

同様に、isgreatest_ifのようにis関数に対しても条件指定機能を設けた関数を用意している。関数名がよく分からないことになっている気がするが……まあ気にしたら負けだろう。

Extractの高速化

Filterによる条件指定がなく、かつシングルスレッド動作の場合で、Extractの動作を20~40%高速化した。マルチスレッドの場合はそれほど速度は上昇しない(CPU使用率を下げる効果は多少あるかもしれない)、Filter条件指定がある場合も効果は薄い。
とはいえ高速化についてはまだ作業途中で、今後もっと効率化を進めるつもりだ。

ラムダ関数用のtryjoinの追加

連結コンテナはTryJoin関数という下位コンテナの連結を試みる関数を持つが、これをラムダ関数中でも使用できるようにした。ちょっと呼び出し方が特殊で、JoinedContainerオブジェクトcがあるとき、if_(c.tryjoin(1_rank), x, y)のようにコンテナオブジェクトのメンバ関数tryjoin関数を呼ぶことで使用する。動作はTryJoinと同じで、連結可能なら連結したうえでtrueを返し、不可能な場合は連結をせずfalseを返す。

細かなバグ修正

バグは使っているうちに色々と見つかってくるので、その都度修正している。JoinedContainerと階層関数を組み合わせて使用したときに起こるバグ、空要素を持つ場合にTraverserが無限ループを起こす可能性のあるバグなどを修正した。

その他現状報告

何とかSIMDを有効化しようと奮闘している。のだが、階層構造や行指向データ構造とSIMDはあまり相性が良くないことに頭を悩ませている。いやまあ、相性の悪さを理解した上で、それでもこのデータ構造を採用したい背景があったのだが。
一応、不可能ではないことは分かっているし、SIMDによる計算量削減だけでなく仮想関数呼び出しオーバーヘッドの削減にも繋がるので、効果は少なからずあるはずだ。ただ場合によっては、やはり行指向を諦めて列指向の設計を始めるかもしれない。こうなると用途上色々と問題が出てくるかもしれないが、逆に列指向のメリットを押し付けることもできるかもしれない。

何にせよ、実装にはまだ時間がかかりそうだ。


  1. population、areaはそれぞれ市町村の人口と面積とする。