← ショーケースに戻る

TAKTショーケース:ADX、ATR、PSAR指標(Python taの移植)

同じベンチマークを4つのレベルで提供します。オリジナルのビルド、レベル0(ビルド設定の調整)、レベル1(証明付きの自動最適化)、レベル2(エンジニアによる最適化)です。4つのプログラムの出力はビット単位で一致します。全レベルのビルド済みプログラム、オリジナル版のソースコード、データ生成ツール、期待される出力、測定結果を収録しています。

ベンチマークの計算内容

100万本のバーからなる1つの履歴でパラメータをスイープし、ウィンドウ7、10、14、20、28でATR、ADX、+DI、−DIを、4通りの設定でParabolic SARを計算します。系列ごとに、全値のチェックサムを出力します。この移植版は、numpyの加算順序も含めてta 0.11.0をビット単位で再現しています(tools/ta_reference_check.py)。

測定(TAKT測定環境)

AMD Threadripper PRO 5975WX(Zen 3)、専用コア上の隔離VMで計測したユーザーモードのサイクル数(vPMU)、交互実行9ラウンドの中央値です。測定したのは、ここにあるファイルそのものです。

レベル ビルド サイクル数(百万) 高速化 時間(ms) レベル0 比:サイクル · 時間
ベースライン cargo build --release 1,376.9 1.00× 503 —
レベル0 LTO、codegen-units 1、target-cpu x86-64-v3 1,248.6 1.10× 463 1.00× · 1.00×
レベル1 レシピ + 証明付きの自動変換 791.4 1.74× 342 1.58× · 1.35×
レベル2 レシピ + エンジニアによる最適化 143.3 9.61× 81 8.72× · 5.73×

同じコアでの比較:Python taは100万本のバーあたり約208秒かかります。同じアルゴリズムのNumba版(これもビット単位で一致)は、計算に0.335秒、pandas.read_csvに0.201秒かかります。レベル2は計算が0.018秒、CSVのパースが0.020秒です。詳細はmeasurements.jsonをご覧ください。

実行方法

python3 tools/gen_ohlc.py 1000000 data/ohlc.csv        # 測定時と同じデータ(data/ を作成)
TAKT_INPUTS=data bin/ta-bench-level2 > out.txt
cmp out.txt expected_stdout.txt                        # バイト単位で一致
for l in base level0 level1 level2; do TAKT_INPUTS=data bin/ta-bench-$l | sha256sum; done

Linux x86-64(glibc)。レベル0〜2はx86-64-v3向けにビルドしています(AVX2、FMA、BMI2:Intel Haswell以降、AMD Zen以降)。計算にはFMAを使用していません。

等価性

4つのプログラムの出力は、上記の入力に加え、形状・サイズ・CSV形式の異なる60個の生成データセットでも一致します。プログラムがpanicで終了する入力も含みます。オリジナル版はPython taとビット単位で一致します:tools/ta_reference_check.py data/ohlc.csv bin/ta-dump-base out/(pandas、numpy、taが必要)。

収録内容

レベル1と2のソースコードは公開していません。当社が納品するのはビルドです。

ソースファイル: README.ja.md

Telegram