THFEでIntel MKLのFFTを使ってみる
昨日はFFTWを使うところまでいったので今度はそれをIntel MKLのFFTにすり替える.
まずDeveloper Reference for Intel Math Kernel Library - Cを参照.
なんとFFTWのラッパーを用意してくれてるではないか,
ということでbuildする.
例によってPICじゃないとTHFEが怒るのでオプションで修正.
cd /opt/intel/mkl/interfaces/fftw3xc/
make -f makefile libintel64 compiler=gnu INSTALL_DIR=~/local/lib CFLAGS="-O3 -fPIC"
できたlibfftw3xc_gnu.aをTHFEが使うように設定.
cmake ../src -DENABLE_SPQLIOS_AVX=off -DENABLE_SPQLIOS_FMA=off -DENABLE_FFTW=on \\
-DFFTW_LIBRARIES="/home/shigeo/local/lib/libfftw3xc_gnu.a" \\
-DFFTW_INCLUDES=/home/shigeo/local/include -DENABLE_TESTS=on
で, ここからが長かった. linkエラーになるのだけど何をリンクしたらよいのか分からない.
いろいろ試して, 探してIntel Math Kernel Library Link Line Advisorというサイトを発見.
使う環境を指定するとリンクオプションを教えてくれる.
Linux/GNU C/Intel 64/Static/64-bit/Sequential/CDFT/BLAS/Intel MPIを指定してみた. IPL64ではなくPL64でよいようなので
// LIB=/opt/intel/mkl/lib/intel64/
-Wl,--start-group ${LIB}/libmkl_cdft_core.a ${LIB}/libmkl_intel_lp64.a
${LIB}/libmkl_sequential.a ${LIB}/libmkl_core.a
${LIB}/libmkl_blacs_intelmpi_lp64.a -Wl,--end-group -lpthread -ldl
でうまく動いた. cmakeでの設定方法が分からない(無駄な時間を溶かした;;)のでCMakeFiles/***/link.txtに直接追加.
とりあえず昨日のtest/addition-boot-fftw
// Platinum 8280
% test/test-addition-boot-fftw
starting bootstrapping 16-bits addition circuit (FA in MUX version)...trial 0
finished bootstrappings 16-bits addition circuit (FA in MUX version)
total time (microsecs)... 1565475
starting bootstrapping 16-bits addition circuit (FA)...trial 0
finished bootstrappings 16-bits addition circuit (FA)
total time (microsecs)... 1594073
starting bootstrapping 16-bits comparison...trial 0
finished bootstrappings 16-bits comparison
total time (microsecs)... 927725
おお, 2倍まではいかないけど結構速くなってよい感じ.
test-bootstrapping-fft-fftwも35msec→19.8msecとなった.
ライブラリの種類から想像するにCluster FFTを使うともっと速くなるのかな(なってほしい).
ラボユース合宿1日目
2年振りの開催でおんやど恵へ.
私はTFHEのFFT部分をIntelのMKLにしたら速くならないか試す.
まずはTFHEのbuild.
しかしrestrict-qualified parameter aliases with argument 2 [-Werror=restrict]のエラー.
issueにあったのでcmakeのオプションで対処.
FFTWにも対応していてそれを使うには
cmake ../src -DENABLE_SPQLIOS_AVX=off -DENABLE_SPQLIOS_FMA=off \\
-DENABLE_FFTW=on -DFFTW_LIBRARIES=/home/shigeo/local/lib/libfftw3.a \\
-DFFTW_INCLUDES=/home/shigeo/local/include -DENABLE_TESTS=on
FFTW_LIBRARIESはライブラリパスではなく実行本体を指定するようだ. -DFFTW_INCLUDESはなんかうまく動かなかったのでcmakeを直接編集して暫定対処.
しかしFFTWがpicでないとリンクエラー.
なかなかスムーズにいかない. --with-picでいくと思ったけどだめだったのでMakefileを直接編集. あと-enable-avx512もつけておく.
ベンチマークはどれが妥当なのか分からないけどとりあえずXeon SPでtest/addition-boot-fftwの結果の冒頭.
// Platinum 8280
starting bootstrapping 16-bits addition circuit (FA in MUX version)...trial 0
finished bootstrappings 16-bits addition circuit (FA in MUX version)
total time (microsecs)... 2920733
starting bootstrapping 16-bits addition circuit (FA)...trial 0
finished bootstrappings 16-bits addition circuit (FA)
total time (microsecs)... 2942965
starting bootstrapping 16-bits comparison...trial 0
finished bootstrappings 16-bits comparison
total time (microsecs)... 1711855
// Core i7-8700
total time (microsecs)... 2426795
starting bootstrapping 16-bits addition circuit (FA)...trial 0
finished bootstrappings 16-bits addition circuit (FA)
total time (microsecs)... 2431186
starting bootstrapping 16-bits comparison...trial 0
finished bootstrappings 16-bits comparison
total time (microsecs)... 1446744
とりあえずここまで.
『彼方の友へ』(伊吹有喜)
明治から昭和30年まであった少女向け雑誌『少女の友』とイラストレーター中原淳一をモチーフにした小説.
徐々に引き込まれた. 後半, 軍の圧力が増し, 空襲に見舞われるシーンは恐ろしい.
ただおじさんのスパイ?とか最後のごちゃごちゃとしたエピローグはよく分からんかった.
VTuneでJIT APIを使おうと思ったらはまった
久しぶりに使おうとしたらけどうまく動かない.
/*
CFLAGS += -I /opt/intel/vtune_amplifier/include/
LDFLAGS += -L /opt/intel/vtune_amplifier/lib64 -ljitprofiling
*/
#include <stdio.h>
#include <jitprofiling.h>
int main()
{
printf("ok=%d\n", iJIT_IsProfilingActive() == iJIT_SAMPLING_ON); // ok=0
}
VTune上で上記コードを動かすとok=1になるはずが0になる.
これが動かないとJITコードの登録ができずプロファイル結果が意味をなさない.
昔は動いたのになんでかなあと調べてみた(昔動いていたはずのコード例).
Using JIT Profiling APIを見ると
libjitprofiling.aをリンクする代わりに
/opt/intel/vtune_amplifier/sdk/src/ittnotify/jitprofiling.c
をリンクしてもよいとのことなのでそれでエラーになってる場所を探す.
いくつかの環境変数を参照しながらライブラリを読もうとしてるのでそれらの環境変数をいろいろ設定したけど駄目.
試行錯誤の上, DL_SYMBOLSが0に評価されるのが駄目っぽいと検討をつける.
DL_SYMBOLSはitnotify_config.hで
#define DL_SYMBOLS (dlopen && dlsym && dlclose)
と定義されているのでとりあえずdlopenすればいいんじゃないかと試すとSEGVする.
// without libjitprofiling.a
#include "jitprofiling.c"
#include <dlfcn.h>
int main()
{
dlopen("dummy", RTLD_LAZY); // ここでSEGV
printf("ok=%d\n", iJIT_IsProfilingActive() == iJIT_SAMPLING_ON);
}
あれぇとよく見るとdlopenたちがittnotify_config.hの中で
void* dlopen(const char*, int) __attribute__((weak));
void* dlsym(void*, const char*) __attribute__((weak));
int dlclose(void*) __attribute__((weak));
と宣言されている. weak属性がついてるのでリンク時にその関数が無くてもリンクエラーにならない.
アドレスが解決されていないとloadもせずに即死する.
たとえば
void f() __attribute__((weak));
#include <stdio.h>
int main()
{
puts("a");
f();
puts("b");
}
はf()の実体がなくてもg++ t.cppで実行ファイルが作れて実行したらf()を呼ぼうとして死ぬ.
なら上記関数宣言を消して素直に#include <dlfcn.h>してやれば動くのかなとittnotify_config.h
//void* dlopen(const char*, int) __attribute__((weak));
//void* dlsym(void*, const char*) __attribute__((weak));
//int dlclose(void*) __attribute__((weak));
#include <dlfcn.h>
と修正したら試したら動いた(要-ldl).
元のファイルがなんでそうしてないのかは調べてない(多分私の知らない深遠な理由が……).
理屈が分かったので提供されているライブラリをそのまま使うには-dlしてdlopenすればよさげと再度
#include <jitprofiling.h>
#include <dlfcn.h>
int main()
{
/*
強制的にdlopenの実体を読み込む
dlopenの呼び出しは失敗してよい
*/
dlopen("dummy", RTLD_LAZY);
printf("ok=%d\n", iJIT_IsProfilingActive() == iJIT_SAMPLING_ON); // ok=1
}
を試すと無事動いて自分の中では解決.
妄想するとJITするような大きめのプログラムだとどこかで勝手にdlopenすることが多いのでうまく動いていて気がつかなかったのかな.
Chia-Network/bls-signature
relicじゃなくてmclを使うように修正したら20%ほど速くなったのでpull requestした.
データ変換関数が一番面倒だった.
取り入れてもらったら変換不要にしたい.
牛鍋
暗号系のえらい方々とお食事会.
値段もすごかった.
本棚
なんやかんやで本が増えてきてるのでまともな本棚でも買ってみるかと注文.
自分で組み立てるのにしたけどめっちゃ大変だった.
お金より時間を優先すべきだな.
次の機会はいつになるか分からんけど次は作ってもらうか完成品にしよう.
HPC勉強会のつもりで会場まで行ったら今日じゃなかったときの絶望感.
しんどい
ここ1カ月ほどのしんどさは異常.
本当に寝てるだけで帰省は終わってしまった.
Maker Faire Tokyo
思い立って参加してみた.
前々職の人に久しぶりに会う.
第109回京都大学丸の内セミナー参加
インドネシアのLGBT. 国や時期によって全然扱いが変わってるのに驚いた.
実際にそこに飛び込んで体験する研究というのがあるのだなあ.