付録C. プログラムとジョブ投入スクリプトのサンプル

FOCUSスパコン利用講習会で使用しているプログラムとジョブ投入スクリプトのサンプルを下記に示します。

※プログラムのコンパイル方法については、「3.コンパイラ、MPIの使用方法」をご参照ください

1. 逐次ジョブのサンプル

hello_world.c <プログラム>

#include <stdio.h>

int main(void) {
  printf("Hello, world!\n");
  return 0;
}

sample.sh <ジョブ投入スクリプト>

#!/bin/bash
#SBATCH -p g006m
#SBATCH -n 1
#SBATCH -J hello_world
#SBATCH -o stdout.%J
#SBATCH -e stderr.%J

./a.out
sleep 60

2. スレッド並列ジョブのサンプル

hello_openmp.c <プログラム>

#include <stdio.h>
#include <omp.h>

main() {
  #pragma omp parallel
  {
    printf("hello world from %d of %d\n", omp_get_thread_num(), omp_get_num_threads());
  }
}

sample_openmp.sh <ジョブ投入スクリプト>

#!/bin/bash
#SBATCH -p f006m
#SBATCH -N 1
#SBATCH --ntasks-per-node=1
#SBATCH -c 10
#SBATCH -J hello_openmp
#SBATCH -o hello_openmp_o.%J
#SBATCH -e hello_openmp_e.%J

module load PrgEnv-intel-18.0.3.222

export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}
./hello_openmp.out

3. プロセス並列ジョブのサンプル

hello_mpi.c <プログラム>

#include <stdio.h>
#include "mpi.h"

int main(int argc, char *argv[]) {
  int numprocs, rank, namelen;
  char processor_name[MPI_MAX_PROCESSOR_NAME];
  int iam = 0, np = 1;

  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Get_processor_name(processor_name, &namelen);

  printf("Hello from process %2d out of %2d on %s\n",
    rank, numprocs, processor_name);

  MPI_Finalize();
}

sample_mpi.sh <ジョブ投入スクリプト>

#!/bin/bash
#SBATCH -p d006m
#SBATCH -N 2
#SBATCH --ntasks-per-node=12
#SBATCH -c 1
#SBATCH -J hello_mpi
#SBATCH -o hello_mpi_o.%J
#SBATCH -e hello_mpi_e.%J

module load PrgEnv-intel-18.0.3.222
module load MPI-impi-18.3.222

mpirun -np ${SLURM_NTASKS} ./hello_mpi.out

4. ハイブリッド並列ジョブのサンプル

hello_hybrid.c <プログラム>

#include <stdio.h>
#include "mpi.h"
#include <omp.h>

int main(int argc, char *argv[]) {
  int numprocs, rank, namelen;
  char processor_name[MPI_MAX_PROCESSOR_NAME];
  int iam = 0, np = 1;

  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Get_processor_name(processor_name, &namelen);

  #pragma omp parallel default(shared) private(iam, np)
  {
    np = omp_get_num_threads();
    iam = omp_get_thread_num();
    printf("Hello from process %2d out of %2d from thread %2d out of %3d on %s\n",
      rank, numprocs, iam, np, processor_name);
  }

  MPI_Finalize();
}

sample_hybrid.sh <ジョブ投入スクリプト>

#!/bin/bash
#SBATCH -p f006m
#SBATCH -N 2
#SBATCH --ntasks-per-node=4
#SBATCH -c 5
#SBATCH -J hello_hybrid
#SBATCH -o hello_hybrid_o.%J
#SBATCH -e hello_hybrid_e.%J

module load PrgEnv-intel-18.0.3.222
module load MPI-impi-18.3.222

export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}
mpirun -np ${SLURM_NTASKS} ./hello_hybrid.exe

▲このページの先頭へ