目录
PIConGPU
简介
PIConGPU (Particle-in-cell on Graphics Processing Units,图形处理单元中的单元粒子),是用于等离子体和激光等离子体物理学的开源仿真框架。PIConGPU是完全相对的,多核,3D3V单元内粒子(PIC)代码。单元内粒子(Particle-in-Cell)算法是等离子体物理学中的核心工具。根据麦克斯韦方程,通过计算等离子体中电子和离子的运动来描述等离子体的动力学。
PIConGPU实现了各种数值方案来解决PIC周期。电磁PIC算法的功能包括:
- 域的中央或者Yee-lattice;
- 解决带电粒子和中性粒子运动方程的粒子推动器;
- 麦克斯韦场求解器;
- 严格保留当前的沉积方案;
- 宏颗粒形状因数,范围从NGP(0级),CIC(1级),TSC(2nd),PSQ(3rd)到P4S(4th);
电磁PIC算法进一步自洽地耦合到:
- 经典辐射反应;
- QED同步辐射(光子发射);
- 先进的场电离方法;
除了电磁PIC算法及其扩展之外,还开发了多种工具和诊断程序,例如:
- 在线,远场辐射诊断,可对带电粒子发出的相干和非相干辐射进行诊断;
- 通过openPMD提供完整的重启和输出功能,包括并行HDF5(通过libSplash)和ADIOS,从而实现了极高的I / O可扩展性和大规模的并行在线分析;
- 2D和3D实时取景和诊断工具;
- 大量可扩展的在线插件;
PIConGPU具有出色的性能和可扩展性,可支持超过18'000个GPU。由HZDR辐射物理研究所的计算辐射物理小组与德累斯顿工业大学密切合作开发和维护。
应用范围
PIConGPU (Particle-in-cell on Graphics Processing Units,图形处理单元中的单元粒子),是用于等离子体和激光等离子体物理学的开源仿真框架,用于开发先进的粒子加速器,癌症,高能物理学和光子科学的放射治疗。 借助PIConGPU将大大提高模拟的预测能力和达到适用于应用的粒子能量。 现在,可以以前所未有的时间和空间分辨率研究控制最终粒子束特性的复杂等离子体动力学。 这将为加速器的开发提供将等离子体加速器推向应用所需的高质量数据。 PIConGPU是等离子体物理应用程序,可通过计算等离子体电子和离子的运动来解决等离子体的动力学问题。该应用被列为Froniter E级重点应用:Frontier Center for Accelerated Application Readiness – Oak Ridge Leadership Computing Facility
alpaka库
alpaka库是用于加速器开发的C ++ 11抽象库。提供了众多使用CUDA,OpenMP(2.0 / 4.0),Boost.Fiber,std :: thread,HIP,TBB等的加速器后端变体,并且还提供了串行执行,可以根据设备进行选择。通过使用特殊接口将它们表示为功能对象,仅需要用户内核的一种实现。无需编写特殊的CUDA,OpenMP或自定义线程代码。加速器后端可以在设备队列中混合。可以在运行时确定哪个加速器后端执行哪个内核。 所使用的抽象与CUDA网格块线程划分策略非常相似。应该并行化的算法必须划分为由小型统一工作项组成的多维网格。这些函数称为内核,并在并行线程中执行。网格中的线程按块组织。块中的所有线程都是并行执行的,并且可以通过快速共享内存进行交互
编译安装
github源码
前人的工作
已经有人做过一些工作,可参考:
- GitHub - psychocoderHPC/picongpu at topic-hip-amd-benachmark3
- GitHub - psychocoderHPC/picongpu at topic-exposeHipBackend
算例创建与编译运行
1、PICongpu依赖的库比较多,许多需要源码安装。相应的依赖库全部安装完毕后,设置相应的环境变量。详细的安装设置说明请参考INSTALL.rst。下面安装过程仅供参考(需要将相应的依赖库提前下载好):
export PICSRC=$PICHOME/picongpu
export PIC_EXAMPLES=$PICSRC/share/picongpu/examples
export PATH=$PICSRC:$PATH
export PATH=$PICSRC/bin:$PATH
export PATH=$PICSRC/src/tools/bin:$PATH
export PYTHONPATH=$PICSRC/lib/python:$PYTHONPATH
#yum install -y zlib zlib-devel
cd $PICHOME
cd $PICSRC/external/zlib && mkdir -p build $PICSRC/lib/zlib && cd build && ./../configure --prefix=$PICSRC/lib/zlib && make && make install
export ZLIB_ROOT=$PICSRC/lib/zlib
export LD_LIBRARY_PATH=$ZLIB_ROOT/lib:$LD_LIBRARY_PATH
export CMAKE_PREFIX_PATH=$ZLIB_ROOT:$CMAKE_PREFIX_PATH
#yum install -y boost-devel
cd $PICHOME
cd $PICSRC/external/boost && mkdir -p $PICSRC/lib/boost && ./bootstrap.sh --with-libraries=atomic,chrono,context,date_time,fiber,filesystem,math,program_options,serialization,system,thread --prefix=$PICSRC/lib/boost && ./b2 install --prefix=$PICSRC/lib/boost -j4
export BOOST_ROOT=$PICSRC/lib/boost
export CMAKE_PREFIX_PATH=$BOOST_ROOT:$CMAKE_PREFIX_PATH
export LD_LIBRARY_PATH=$BOOST_ROOT/lib:$LD_LIBRARY_PATH
export CPLUS_INCLUDE_PATH=$BOOST_ROOT/include:$CPLUS_INCLUDE_PATH
export BOOST_INCLUDEDIR=$BOOST_ROOT/include
export LIBRARY_PATH=$BOOST_ROOT/lib:$LIBRARY_PATH
#yum install -y libpng-devel
cd $PICHOME
cd $PICSRC/external/libpng && mkdir -p build $PICSRC/lib/libpng && cd build && CPPFLAGS=-I$PICSRC/lib/zlib/include LDFLAGS=-L$PICSRC/lib/zlib/lib ./../configure --enable-static --enable-shared --prefix=$PICSRC/lib/libpng && make && make install
export PNG_ROOT=$PICSRC/lib/libpng
export CMAKE_PREFIX_PATH=$PNG_ROOT:$CMAKE_PREFIX_PATH
export LD_LIBRARY_PATH=$PNG_ROOT/lib:$LD_LIBRARY_PATH
#yum install -y pngwriter
cd $PICHOME
cd $PICSRC/external/pngwriter && mkdir -p build $PICSRC/lib/pngwriter && cd build && cmake3 -DCMAKE_INSTALL_PREFIX=$PICSRC/lib/pngwriter ../ && make && make install
export CMAKE_PREFIX_PATH=$PICSRC/lib/pngwriter:$CMAKE_PREFIX_PATH
export LD_LIBRARY_PATH=$PICSRC/lib/pngwriter/lib:$LD_LIBRARY_PATH
#yum install -y libhdf5-openmpi-dev libboost-program-options-dev
cd $PICHOME
cd $PICSRC/external/hdf5 && mkdir -p build $PICSRC/lib/hdf5 && cd build && ./../configure --enable-parallel --enable-shared --prefix=$PICSRC/lib/hdf5 && make && make install
export HDF5_ROOT=$PICSRC/lib/hdf5
export HDF5_DIR=$HDF5_ROOT
export LD_LIBRARY_PATH=$HDF5_ROOT/lib:$LD_LIBRARY_PATH
export PATH=$PATH:$HDF5_ROOT/bin
export CPATH=:$CPATH:$HDF5_ROOT/include
# install libSplash
cd $PICHOME
cd $PICSRC/external/libsplash && mkdir -p build $PICSRC/lib/libsplash && cd build && cmake3 -DCMAKE_INSTALL_PREFIX=$PICSRC/lib/libsplash -DSplash_USE_MPI=ON -DSplash_USE_PARALLEL=ON ../ && make && make install
export CMAKE_PREFIX_PATH=$PICSRC/lib/libsplash:$CMAKE_PREFIX_PATH
export LD_LIBRARY_PATH=$PICSRC/lib/libsplash/lib:$LD_LIBRARY_PATH
#yum install -y libblosc-devel
cd $PICHOME
cd $PICSRC/external/c-blosc && mkdir -p build $PICSRC/lib/blosc && cd build && cmake3 -DCMAKE_INSTALL_PREFIX=$PICSRC/lib/blosc -DPREFER_EXTERNAL_ZLIB=ON .. && make && make install
export BLOSC_ROOT=$PICSRC/lib/blosc
export CMAKE_PREFIX_PATH=$BLOSC_ROOT:$CMAKE_PREFIX_PATH
export LD_LIBRARY_PATH=$BLOSC_ROOT/lib:$LD_LIBRARY_PATH
#yum install -y libadios-devel libadios-bin
cd $PICHOME
cd $PICSRC/external/adios && mkdir -p build $PICSRC/lib/adios && cd build && CFLAGS="-fPIC" ./../configure --enable-static --enable-shared --prefix=$PICSRC/lib/adios --with-mpi=$MPI_ROOT --with-blosc=$PICSRC/lib/blosc --with-hdf5=$PICSRC/lib/hdf5 --with-zlib=$PICSRC/lib/zlib && make && make install
export ADIOS_ROOT=$PICSRC/lib/adios
export LD_LIBRARY_PATH=$ADIOS_ROOT/lib:$LD_LIBRARY_PATH
下面是将相应环境设置写入文件,构建编译运行算例前source一下,可能更方便一些。
cat<<EOF > $PICHOME/env.sh
export PICHOME=$PICHOME
export PICSRC=\\$PICHOME/picongpu
export PIC_EXAMPLES=\\$PICSRC/share/picongpu/examples
export PATH=\\$PICSRC:\\$PATH
export PATH=\\$PICSRC/bin:\\$PATH
export PATH=\\$PICSRC/src/tools/bin:\\$PATH
export PYTHONPATH=\\$PICSRC/lib/python:\\$PYTHONPATH
export ZLIB_ROOT=\\$PICSRC/lib/zlib
export LD_LIBRARY_PATH=\\$ZLIB_ROOT/lib:\\$LD_LIBRARY_PATH
export CMAKE_PREFIX_PATH=\\$ZLIB_ROOT:\\$CMAKE_PREFIX_PATH
export BOOST_ROOT=\\$PICSRC/lib/boost
export LD_LIBRARY_PATH=\\$BOOST_ROOT/lib:\\$LD_LIBRARY_PATH
export CPLUS_INCLUDE_PATH=\\$BOOST_ROOT/include:\\$CPLUS_INCLUDE_PATH
export LIBRARY_PATH=\\$BOOST_ROOT/lib:\\$LIBRARY_PATH
export PNG_ROOT=\\$PICSRC/lib/libpng
export CMAKE_PREFIX_PATH=\\$PNG_ROOT:\\$CMAKE_PREFIX_PATH
export LD_LIBRARY_PATH=\\$PNG_ROOT/lib:\\$LD_LIBRARY_PATH
export CMAKE_PREFIX_PATH=\$PICSRC/lib/pngwriter:\\$CMAKE_PREFIX_PATH
export LD_LIBRARY_PATH=\\$PICSRC/lib/pngwriter/lib:\\$LD_LIBRARY_PATH
export CMAKE_PREFIX_PATH=\\$PICSRC/lib/splash:\\$CMAKE_PREFIX_PATH
export LD_LIBRARY_PATH=\\$PICSRC/lib/splash/lib:\\$LD_LIBRARY_PATH
export HDF5_ROOT=\\$PICSRC/lib/hdf5
export LD_LIBRARY_PATH=\\$HDF5_ROOT/lib:\\$LD_LIBRARY_PATH
export BLOSC_ROOT=\\$PICSRC/lib/blosc
export CMAKE_PREFIX_PATH=\$BLOSC_ROOT:\\$CMAKE_PREFIX_PATH
export LD_LIBRARY_PATH=\\$BLOSC_ROOT/lib:\\$LD_LIBRARY_PATH
export ADIOS_ROOT=\\$PICSRC/lib/adios
export LD_LIBRARY_PATH=\\$ADIOS_ROOT/lib:\\$LD_LIBRARY_PATH
EOF
source $PICHOME/env.sh
2、创建测试用例
export SCRATCH=$HOME
// PIConGPU input files
mkdir $HOME/picInputs
// PIConGPU simulation output
mkdir $SCRATCH/runs
3、 创建输入参数集
//clone the LWFA example to $HOME/picInputs/myLWFA
pic-create $PIC_EXAMPLES/LaserWakefield $HOME/picInputs/myLWFA
4、 编译模拟
# switch to your input directory
cd $HOME/picInputs/myLWFA
pic-build -b xxx
5、 运行模拟
# example run for an interactive simulation on the same machine
tbg -s bash -c etc/picongpu/1.cfg -t etc/picongpu/bash/mpiexec.tpl $SCRATCH/runs/lwfa_001
算例测试
注意:使用上述5提交方式提交作业,作业运行可能会卡住。需要根据mpiexec.tpl文件的具体情况进行修改。例如:
sed -i 's/export OMPI_MCA_io\=\^ompio/\export OMPI_MCA_io\=ompio/g' etc/picongpu/bash/mpiexec.tpl