#!/usr/bin/env ruby
#
# 表題 spml_bench.rb : spml ベンチマーク用スクリプト
#
#   * ステップ数の異なる時間積分の時間差を測定し, ファイルに出力する
#
#   * 異なる MPI 並列数, OpenMP 並列数による違いを調べる
#
#   * 下記の例は, 解像度により実験設定ファイル名を指定しているが,
#     2 つの時間ステップの実験ファイル名と初期値生成ファイル名を
#     独自に指定しても良い
#
# 履歴  2025/10/03 竹広真一
#
require 'open3'

#==================== 設定 ====================
#
#---------- 実行ファイル名
#
# MPIRUN="mpirun.mpich"
# TESTROOT="w_mpi_module_bench_spml2"
# TESTROOT="ua_mpi_module_bench_spml2"
MPIRUN="mpirun.openmpi"
# TESTROOT="w_mpi_module_bench_spml1"
TESTROOT="wa_mpi_module_bench_spml1"
TEST_PROGRAM='./'+TESTROOT+'.out'
#
#---------- ログファイル名
#
BENCHLOG=TESTROOT+'.log'

#
#---------- 並列計算設定
MPILIST  = [1,2,4,8,16]   # MPI 並列数リスト
CORELIST = [1,2,4,8,16]   # COE 数リスト
# OMPLIST = [1,2,4]    

#==================== 関数定義 ====================
def test_command(mpinum)
  return sprintf(" %s -n %d %s",
                  MPIRUN, mpinum, TEST_PROGRAM)
end

#==================== メイン ====================
benchfile=File.open(BENCHLOG,mode="w")

benchfile.puts(sprintf("# OMP MPI ETIME(S2G,G2S), GFlops(S2G,G2S)\n"))
# printf("# %s\n", RESOLUTION) 
# printf("# OMP MPI TIME(sec)\n")

first=true

CORELIST.each do |core|
  # printf("# OMP = %d\n", omp)
  
  MPILIST.each do |mpi|
    omp = core/mpi
    next if omp == 0 

    #---------- 計測 ----------
    command = test_command(mpi)
    printf "# %s\n", command
    
    stdout, stderr_output, status = Open3.capture3({'OMP_NUM_THREADS' => omp.to_s},command)
    # printf stdout

    if first then
      benchfile.puts(sprintf "# %s\n",stdout.match(/MM=\ ?(\d+), IM=\ ?(\d+) JM=\ ?(\d+)/))
      first = false
    end
    
    etime = stdout.scan(/(\d+(\.\d+)?(E[+-]\d+)?) sec/)
    gflops= stdout.scan(/(\d+(\.\d+)?(E[+-]\d+)?) GFlops/)
    s2gtime = etime.to_a[0][0].to_f ; g2stime = etime.to_a[1][0].to_f
    # p s2gtime,g2stime
    s2gGFlops = gflops.to_a[0][0].to_f ; g2sGFlops = gflops.to_a[1][0].to_f
    # p s2gGFlops, g2sGFlops

    benchfile.puts(sprintf(" %d  %d  %f  %f  %f  %f\n", omp, mpi, s2gtime, g2stime, s2gGFlops, g2sGFlops))
  end
  #benchfile.puts("\n\n")
end  

benchfile.close

