diff --git a/README.md b/README.md index 04091f3fb5dbd5268d6c8b5224f7eb90cb9658ce..24e5bb862b5108a068e96c9d11aa7d34ff958e3a 100644 --- a/README.md +++ b/README.md @@ -3,21 +3,136 @@ #### 介绍 A high-performance parallel I/O library for scientific computing, adapted and packaged for the openEuler operating system to support HPC applications. +SIONlib (Scalable I/O library for parallel access to task-local files) 是一个专为科学计算设计的高性能并行 I/O 库。本项目将其适配并打包为 openEuler 操作系统兼容的 RPM 包,旨在为 openEuler 上的高性能计算 (HPC) 应用提供强大的并行 I/O 能力。 + +**主要特性:** +* **openEuler 兼容:** 适配 openEuler 24.03 LTS SP1 及其兼容版本。 +* **Fortran 兼容性:** 解决了新版本 gfortran 编译器带来的类型不匹配问题。 +* **RPM 打包:** 提供标准的 RPM 包,简化在 openEuler 系统上的安装和部署。 +* **静态链接:** 提供静态库,方便应用集成。 +* **工具集:** 包含 sioncat、siondefrag、siondump、sionsplit、sionversion 等实用工具。 + #### 软件架构 -软件架构说明 +SIONlib 的核心架构设计用于支持数千个处理器对一个或少量物理文件进行高效的并行读写。其主要组件包括: +* **核心 I/O 逻辑:** 实现文件分块、进程间通信协调等功能。 +* **多语言接口:** 提供 C/C++ 和 Fortran 语言接口。 +* **并行文件抽象:** 将多个任务本地文件抽象为一个或少数大型共享文件。 +* **MPI 整合:** 深度整合 MPI 协议,实现并行访问。 + +本项目构建的 SIONlib 版本为 `1.7.6`,主要以静态库的形式提供。 #### 安装教程 -1. xxxx -2. xxxx -3. xxxx +1. **下载 RPM 包:** + 您可以从本仓库或其他分发渠道获取以下 RPM 包: + * `sionlib-1.7.6-1.x86_64.rpm` (主包,包含可执行工具和静态库) + * `sionlib-devel-1.7.6-1.x86_64.rpm` (开发包,包含头文件和 pkg-config 文件) + * `sionlib-1.7.6-1.src.rpm` (源码包) + +2. **安装 RPM 包:** + 使用 `dnf` 包管理器进行安装。请确保您拥有 `sudo` 权限。 + ```bash + sudo dnf install ./sionlib-1.7.6-1.x86_64.rpm ./sionlib-devel-1.7.6-1.x86_64.rpm -y + ``` + `dnf` 将自动处理软件包依赖关系。 + + **注意:** 如果您从 openEuler 官方仓库或其他信任的第三方仓库安装,命令会更简单: + ```bash + sudo dnf install sionlib sionlib-devel -y + ``` + +3. **验证安装:** + 安装完成后,您可以验证 SIONlib 的组件是否正确安装: + ```bash + ls -l /usr/lib64/liblsion*.a # 检查静态库 + ls -l /usr/include/sion*.h # 检查头文件 + ls -l /usr/bin/sioncat # 检查可执行工具 (sioncat, siondump等) + pkg-config --cflags sionlib # 验证 Cflags + pkg-config --libs sionlib # 验证 Libs + ``` + 预期 `pkg-config` 命令会输出正确的头文件路径和链接选项。 #### 使用说明 -1. xxxx -2. xxxx -3. xxxx +SIONlib 的使用与传统的 MPI 并行 I/O 类似,主要通过其提供的 C/C++ 或 Fortran 接口进行文件操作。 + +1. **C/C++ 应用程序示例:** + 创建一个 C 语言源文件(例如 `my_app.c`): + ```c + #include + #include + #include + #include "sion.h" // SIONlib 头文件 + + int main(int argc, char **argv) { + int rank, num_procs; + long long sid; // SIONlib 文件句柄 + FILE *fp; // 标准 C 文件指针 + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &num_procs); + + sid = sion_open("my_sion_file.sion", "wb", &num_procs, &rank, &fp, NULL); + if (sid == -1) { + fprintf(stderr, "Rank %d: sion_open failed!\n", rank); + MPI_Abort(MPI_COMM_WORLD, 1); + } + + char buffer[100]; + snprintf(buffer, sizeof(buffer), "Hello from rank %d!\n", rank); + fwrite(buffer, 1, strlen(buffer), fp); + + sion_close(sid); + MPI_Finalize(); + return 0; + } + ``` + 编译和运行: + ```bash + mpicc -o my_app my_app.c $(pkg-config --cflags sionlib) $(pkg-config --libs sionlib) + mpirun -np 4 ./my_app + ``` + +2. **Fortran 应用程序示例:** + 创建一个 Fortran 源文件(例如 `my_fortran_app.f`): + ```fortran + program my_fortran_app + implicit none + include 'mpif.h' + include 'sion_f77.h' ! 或者 sion_f90.h + + integer :: rank, num_procs, ierr + integer*8 :: sid, fp ! SIONlib 句柄 + + character(len=100) :: buffer + integer :: buffer_len, written_len + + call MPI_INIT(ierr) + call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) + call MPI_COMM_SIZE(MPI_COMM_WORLD, num_procs, ierr) + + call LFSION_OPEN_MPI('my_fortran_file.sion', 'wb', num_procs, rank, sid, fp, ierr) + if (ierr /= 0) then + write(*,*) 'Rank ', rank, ': LFSION_OPEN_MPI failed!' + call MPI_ABORT(MPI_COMM_WORLD, 1, ierr) + end if + + write(buffer, '(A,I0,A)') 'Hello from rank ', rank, '!' + buffer_len = len_trim(buffer) + call LFSION_FWRITE_C(buffer, 1, buffer_len, sid, written_len) + + call LFSION_CLOSE(sid, ierr) + call MPI_FINALIZE(ierr) + end program my_fortran_app + ``` + 编译和运行: + ```bash + mpifort -o my_fortran_app my_fortran_app.f $(pkg-config --cflags sionlib) $(pkg-config --libs sionlib) + mpirun -np 4 ./my_fortran_app + ``` + 更多详细信息和 API 参考,请参阅 SIONlib 官方文档。 #### 参与贡献 @@ -27,6 +142,9 @@ A high-performance parallel I/O library for scientific computing, adapted and pa 4. 新建 Pull Request +**重要说明:** +SIONlib 的版权和代码属于原作者,代码源地址 https://github.com/poodarchu/sionlib。本项目针对 SIONlib 代码进行的 openEuler 适配和修改,相关成果已提交 PR 至原作者仓库,但作者目前联系不上。如有任何侵权行为,请联系 `1261700278@qq.com`。 + #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md diff --git a/sionlib-1.7.6.tar.gz b/sionlib-1.7.6.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a018f5d6868d821d0cea04461a9fbd05f0d0a597 Binary files /dev/null and b/sionlib-1.7.6.tar.gz differ diff --git a/sionlib.spec b/sionlib.spec new file mode 100644 index 0000000000000000000000000000000000000000..8068bbbffdf94c709c76f318ff0af17902116be4 --- /dev/null +++ b/sionlib.spec @@ -0,0 +1,128 @@ +Name: sionlib +Version: 1.7.6 +Release: 1%{?dist} +Summary: High-performance parallel I/O library for scientific applications +%global debug_package %{nil} + +License: LGPLv3+ +URL: https://www.fz-juelich.de/jsc/sionlib +Source0: %{name}-%{version}.tar.gz + +BuildRequires: gcc, gcc-c++, gcc-gfortran, make +BuildRequires: openmpi-devel +BuildRequires: pkgconfig + +Requires: openmpi + +%description +SIONlib is a high-performance parallel I/O library developed at Forschungszentrum Jülich. +It is widely used in scientific computing for collecting and processing performance data. +This package provides the SIONlib library and its development files for openEuler. + +%package devel +Summary: Development files for SIONlib +Requires: %{name} = %{version}-%{release} +Requires: openmpi-devel +Requires: pkgconfig + +%description devel +The %{name}-devel package contains the header files and libraries needed +to develop applications that use SIONlib. + +%prep +%setup -q -n sionlib-%{version} + +%build +cd %{_builddir}/sionlib-%{version} + +# Patching fortran Makefiles in RPM build environment +# This is a copy of the sed commands used in build_local_sionlib, ensure they are correct +sed -i 's|\$(F77) \$(F77FLAGS) -c|$(F77) $(F77FLAGS) -fallow-argument-mismatch -c|g' src/fortraninterface/Makefile +sed -i 's|\$(MPIF77) \$(F77FLAGS) -c|$(MPIF77) $(F77FLAGS) -fallow-argument-mismatch -c|g' src/fortraninterface/Makefile +sed -i 's|\$(OMPF77) \$(F77FLAGS) -c|$(OMPF77) $(F77FLAGS) -fallow-argument-mismatch -c|g' src/fortraninterface/Makefile +sed -i 's|\$(F90) -c|$(F90) $(F90FLAGS) -fallow-argument-mismatch -c|g' src/fortraninterface/Makefile +sed -i 's|\$(MPIF90) \$(FFLAGS) -c|$(MPIF90) $(FFLAGS) -fallow-argument-mismatch -c|g' src/fortraninterface/Makefile +sed -i 's|\$(OMPF90) \$(FFLAGS) -c|$(OMPF90) $(FFLAGS) -fallow-argument-mismatch -c|g' src/fortraninterface/Makefile +sed -i 's|\$(MPIF90) \$(FFLAGS) -c|$(MPIF90) $(FFLAGS) -fallow-argument-mismatch -c|g' src/parutils/Makefile + +sed -i '20c\PLATCC = \$(MPICC)' mf/Makefile.defs.linux-gomp +sed -i '29c\CFLAGS = -std=c99 -fPIC' mf/Makefile.defs.linux-gomp +sed -i '32c\CXXFLAGS = -O3' mf/Makefile.defs.linux-gomp +sed -i '35c\FFLAGS =' mf/Makefile.defs.linux-gomp +sed -i '38c\F90LAGS = -ffree-form' mf/Makefile.defs.linux-gomp +sed -i '43c\LDFLAGS =\$(OPTFLAGS) \$(HINTSLIB) ' mf/Makefile.defs.linux-gomp + +sed -i '/TESTSPY = test_pysopn_1.py/cTESTSPY =' test/serial/Makefile + +echo "y" | ./configure --prefix=%{_prefix} --compiler=gnu --mpi=openmpi --disable-parutils --force-64 + +%make_build + +%install +rm -rf %{buildroot} +cd %{_builddir}/sionlib-%{version} + +BUILD_SUBDIR=$(ls -d build-*) + +mkdir -p %{buildroot}%{_bindir} +mkdir -p %{buildroot}%{_libdir} +mkdir -p %{buildroot}%{_includedir} +mkdir -p %{buildroot}%{_docdir}/%{name} +mkdir -p %{buildroot}%{_libdir}/pkgconfig +mkdir -p %{buildroot}%{_licensedir}/%{name} + +install -m 644 LICENSE %{buildroot}%{_licensedir}/%{name} +install -m 644 README %{buildroot}%{_docdir}/%{name} + +find "${BUILD_SUBDIR}/build/lib" -maxdepth 1 -type f -name "sion*.h" -exec install -m 644 '{}' %{buildroot}%{_includedir} \; +find "${BUILD_SUBDIR}/build/fortraninterface" -maxdepth 1 -type f -name "sion*.h" -exec install -m 644 '{}' %{buildroot}%{_includedir} \; +find "${BUILD_SUBDIR}/build/cppinterface" -maxdepth 1 -type f -name "sion*.h" -exec install -m 644 '{}' %{buildroot}%{_includedir} \; + +find "${BUILD_SUBDIR}/build/lib" -maxdepth 1 -type f -name "liblsion*.a" -exec install -m 644 '{}' %{buildroot}%{_libdir} \; + +if [ -f "${BUILD_SUBDIR}/build/utils/sioncat" ]; then + install -m 755 "${BUILD_SUBDIR}/build/utils/sioncat" %{buildroot}%{_bindir} +fi +if [ -f "${BUILD_SUBDIR}/build/utils/siondefrag" ]; then + install -m 755 "${BUILD_SUBDIR}/build/utils/siondefrag" %{buildroot}%{_bindir} +fi +if [ -f "${BUILD_SUBDIR}/build/utils/siondump" ]; then + install -m 755 "${BUILD_SUBDIR}/build/utils/siondump" %{buildroot}%{_bindir} +fi +if [ -f "${BUILD_SUBDIR}/build/utils/sionsplit" ]; then + install -m 755 "${BUILD_SUBDIR}/build/utils/sionsplit" %{buildroot}%{_bindir} +fi +if [ -f "${BUILD_SUBDIR}/build/utils/sionversion" ]; then + install -m 755 "${BUILD_SUBDIR}/build/utils/sionversion" %{buildroot}%{_bindir} +fi + +cat > %{buildroot}%{_libdir}/pkgconfig/sionlib.pc << 'EOFF' +prefix=%{_prefix} +exec_prefix=\${prefix} +libdir=\${exec_prefix}/lib64 +includedir=\${prefix}/include + +Name: sionlib +Description: SIONlib high-performance parallel I/O library (static) +Version: 1.7.6 +Cflags: -I\${includedir} +Libs: -L\${libdir} -lcom_64 -lcom_64_lock_none -lcom_64_lock_pthreads -lsionser_64 -lrt -lm -L/usr/lib64/openmpi/lib -lmpi_mpifh -lmpi_usempif08 -lmpi_usempi_ignore_tkr -lmpi_mpicxx -lmpi -lpthread +EOFF + +%files +%license %{_licensedir}/%{name}/LICENSE +%doc README +%{_libdir}/liblsion*.a +%{_bindir}/sioncat +%{_bindir}/siondefrag +%{_bindir}/siondump +%{_bindir}/sionsplit +%{_bindir}/sionversion + +%files devel +%{_includedir}/sion* +%{_libdir}/pkgconfig/*.pc + +%changelog +* Tue Aug 27 2024 sjk <1261700278@qq.com> - 1.7.6-1 +- Initial RPM package for SIONlib.