Skip to content

Instantly share code, notes, and snippets.

View kumpeishiraishi's full-sized avatar

Kumpei Shiraishi kumpeishiraishi

View GitHub Profile

粒子系シミュレーションにおける高速化のメモ

個人的なチェックリスト

  1. まずは普通にコードを完成させる
    • MDなら、NVEで時間発展させて全エネルギーの保存を確認し、コードにバグがないことの確信を得る
      • 全エネルギーの揺らぎが、運動エネルギー・ポテンシャルエネルギーの揺らぎと比べて、2桁程度以上小さければOK
    • MCなら、MSDなどを計算して、自分のコードのダイナミクスと先行研究に齟齬がないことを確認する(その他の方法だと、サンプルした配置のポテンシャルの比較?)
    • この段階では、高速化の諸々を先取りするといった余計なことはしない
    • まずは、とにかく素直に正しいコードを書き終える方が、作業は結局速く終わる(経験上)

C++で format する

Pythonでは文字列操作が format で簡単にできる。

print("ゼロ埋め {:05d}".format(99))
# output: ゼロ埋め 00099

print("指数表記 {:.2e}".format(3.14))
# output: 指数表記 3.14e+00

私の研究分野では、実対称行列の固有値と固有ベクトルを求めることが多い。 固有値問題は最も基本的な数値計算であり、様々なパッケージが簡便に利用できる。 ここでは、C++のライブラリであるEigenを使って実対称行列の固有値を求める方法を、備忘のためにまとめる。

インストール

$ cd /home/shiraishi/.local
$ curl -O "https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz"
$ tar xf eigen-3.4.0.tar.gz
$ mv ./eigen-3.4.0/Eigen ./include
@kumpeishiraishi
kumpeishiraishi / CMakeLists.txt
Created December 10, 2022 07:55
My minimum cmake file with cnpy, AVX intrinsics, and Eigen
cmake_minimum_required(VERSION 3.13)
project(test_cmake CXX)
add_executable(a.out main.cpp)
target_include_directories(a.out PRIVATE /home/shiraishi/.local/include ${MKLROOT}/include)
target_link_directories(a.out PRIVATE /home/shiraishi/.local/lib ${MKLROOT}/lib/intel64)
target_compile_options(a.out PRIVATE -O3 -inline-forceinline -xCORE_AVX512 -DMKL_LP64)
@kumpeishiraishi
kumpeishiraishi / CMakeLists.txt
Created December 9, 2022 08:23
My minimum cmake file with cnpy and AVX intrinsics
cmake_minimum_required(VERSION 3.13)
project(test_cmake CXX)
add_executable(a.out main.cpp)
target_include_directories(a.out PRIVATE /home/shiraishi/.local/include)
target_link_directories(a.out PRIVATE /home/shiraishi/.local/lib)
target_compile_options(a.out PRIVATE -O3 -xCORE_AVX512)
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

研究室の計算機でMPI並列するには

研究室の計算機クラスタでは、1つのノード内で24コア程度のCPUが使える。 単一ノード内の並列計算ならば、Open MPを使って比較的簡単にコード開発・実行が出来るが、並列数に制限がある。 これを越える並列数で計算するため、MPIの使い方のメモを残しておく。 MPI的に正しい書き方・術語である自信はないので、鵜呑みにせず各自で勉強してほしい。

プログラムを書く

# Your .skk-record location
filename = '~/.skk-record'
import os
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
filename = os.path.expanduser(filename)
f = open(filename)
@kumpeishiraishi
kumpeishiraishi / zerofill.cpp
Last active May 18, 2018 02:33
Another way to set width
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
int main() {
std::stringstream ss;
for (int i=0; i<15; i++) {
ss << std::setw(2) << std::setfill('0') << i;
std::cout << ss.str() << std::endl;
@kumpeishiraishi
kumpeishiraishi / set_width.cpp
Created May 9, 2018 06:02
set width and set fill
#include <iostream>
#include <iomanip>
#include <sstream>
int main() {
int t = 58;
std::ostringstream ss;
ss << std::setw(5) << std::setfill('0') << t;
std::cout << ss.str() << std::endl; // -> '00058'
}