内容
Intel fortranをAMDのCPU (Zen2, Zen3)で使う時の最適化オプション
結論
Ryzen CPUでは-archオプションを使うと非常に速くなった。
Intel CPUで有効な-xHostや-ax、-x、-parallelは効かない。
ifort -O3 -ipo -arch CORE-AVX2 (linux)
ifort /O3 /Qipo /arch:CORE-AVX2 (windows)
肝要なのは-archオプション。それ以外は状況に応じて変える。
CPUのarchtectureの探し方は後述。
環境
machine 1
CPU: AMD Ryzen Threadripper PRO 3995WX 64-Cores (Zen2)
OS: Ubuntu 22.04.2 LTS (lsb_release -a にて確認)
Compiler: ifort 2021.5.0 20211109 (ifort --version)
machine 2
CPU: AMD Ryzen 9 5950X 16-Core Processor (Zen3)
OS: Windows 11 22H2 (build 22621.1848) (winverにて確認)
Compiler: ifort version 19.1.3.311 (build 20201010_000000)
命令セットを探す方法
CORE-AVX2など、そのCPUで一番早い命令セットを見つけるため、以下の操作を行った。
ifort オプション検索
ifort -help codegen (linux)
ifort /help (windows)
-archにて使えそうなパラメタを探す。(CORE-AVX2, AVX, SSE4.2など)
※手持ちのifortではCORE-AVX512に対応していなかった。
CPU architecture確認
下記コマンドを使う。(windowsでもwsl上で動く)
cat /proc/cpuinfo
対応する命令セット一覧が表示される
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf rapl pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate ssbd mba ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr rdpru wbnoinvd amd_ppin arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif v_spec_ctrl umip rdpid overflow_recov succor smca sev sev_es
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave osxsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw wdt topoext perfctr_core mwaitx fsgsbase bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a rdseed adx smap clflushopt clwb sha_ni umip vaes vpclmulqdq rdpid
見つからないときは、grepで検索しても良い。(実際には該当箇所が赤字で表示される)
$cat /proc/cpuinfo | grep -i avx2
flags : fpu ... bmi1 avx2 smep ...