ข้ามไปที่เนื้อหา

Translation update pending

The Thai translation may be out of date because the Japanese source has changed. The existing translation remains available while it is being updated.

การบิลด์โดยใช้ GPU

FrontISTR สามารถทำงานบน GPU โดยใช้ความสามารถ OpenACC ของ NVIDIA HPC SDK หน้านี้อธิบายขั้นตอนการบิลด์โดยเปิดใช้ GPU และวิธีการรัน

สำหรับไลบรารีที่เป็นข้อกำหนดเบื้องต้น โปรดดู ไลบรารีที่จำเป็นและไลบรารีเสริม

ขั้นตอนการบิลด์

ใช้คอมไพเลอร์ของ NVIDIA HPC SDK (nvc, nvc++, nvfortran) ในสภาพแวดล้อมคลัสเตอร์ HPC ต้องโหลด NVIDIA HPC SDK ตามคู่มือของสภาพแวดล้อมก่อนบิลด์ (ตัวอย่าง: module load nvhpc)

เนื่องจากไลบรารีเสริม เช่น METIS, MUMPS และ MKL ไม่รองรับ GPU ตัวอย่างคำสั่งด้านล่างจึงปิดใช้งานไลบรารีเหล่านี้ (WITH_METIS=OFF เป็นต้น)

ดังที่อธิบายไว้ใน ขั้นตอนการบิลด์ด้วย CMake เมื่อระบุ NVIDIA HPC SDK (nvc, nvc++, nvfortran) เป็นคอมไพเลอร์ CMakeLists.txt จะตั้งค่า -gpu=ccnative,mem:managed โดย ccnative เป็นตัวเลือกที่ตรวจหา GPU ของสภาพแวดล้อมบิลด์โดยอัตโนมัติและเลือกเป้าหมายที่เหมาะสม จึงไม่ต้องแก้ไขด้วยตนเองสำหรับแต่ละสภาพแวดล้อม ส่วน mem: เป็นตัวเลือกที่กำหนดวิธีจัดการหน่วยความจำ GPU และจำเป็นต้องระบุเนื่องจากการทำงานบน GPU ของ FrontISTR ใช้ Unified Memory เป็นสมมติฐาน mem:managed เป็นค่าเริ่มต้นสำหรับสภาพแวดล้อมทั่วไปที่ CPU และ GPU มีหน่วยความจำแยกจากกัน

หมายเหตุ: ในสถาปัตยกรรมที่ CPU และ GPU เชื่อมรวมกันด้วย NVLink เช่น Miyabi (GH200) จะใช้ mem:unified แทน mem:managed ดังนั้นให้แก้ไขตามสภาพแวดล้อมที่ใช้งาน (-gpu=ccnative,mem:unified)

OpenACC + OpenMP (ไม่มี MPI)

mkdir build
cd build
CC=nvc CXX=nvc++ FC=nvfortran cmake \
  -DWITH_MPI=OFF -DWITH_OPENMP=ON \
  -DWITH_METIS=OFF -DWITH_MUMPS=OFF \
  -DWITH_MKL=OFF -DWITH_LAPACK=OFF \
  -DWITH_ML=OFF -DWITH_REFINER=OFF -DWITH_REVOCAP=OFF \
  ..
make -j

OpenACC + OpenMP + MPI

เมื่อใช้ MPI คอมไพเลอร์ wrapper ของ MPI (mpicc เป็นต้น) ต้องถูกตั้งค่าให้เรียกคอมไพเลอร์ NVIDIA HPC SDK (nvc เป็นต้น) ภายใน ในสภาพแวดล้อมคลัสเตอร์ HPC เมื่อโหลด NVIDIA HPC SDK และไลบรารี MPI ด้วยคำสั่ง เช่น module load หลายระบบจะตั้งค่าเช่นนี้โดยอัตโนมัติ แต่เวอร์ชันที่แนะนำและขั้นตอนการโหลดแตกต่างกันในแต่ละสภาพแวดล้อม โปรดดูคู่มือผู้ใช้ของสภาพแวดล้อมนั้นสำหรับรายละเอียด

mkdir build
cd build
CC=mpicc CXX=mpic++ FC=mpif90 cmake \
  -DWITH_MPI=ON -DWITH_OPENMP=ON \
  -DWITH_METIS=OFF -DWITH_MUMPS=OFF \
  -DWITH_MKL=OFF -DWITH_LAPACK=OFF \
  -DWITH_ML=OFF -DWITH_REFINER=OFF -DWITH_REVOCAP=OFF \
  ..
make -j

ไม่มี OpenACC (รุ่น CPU)

หากต้องการบิลด์รุ่น CPU ด้วยคอมไพเลอร์ NVIDIA HPC SDK โดยไม่ใช้ OpenACC ให้กำหนด -DNVHPC_NO_ACC=ON ในกรณีนี้จะไม่มีการตั้งค่า -acc, -Minfo=accel และ -gpu=ccnative,mem:managed ใช้การตั้งค่านี้เมื่อเปรียบเทียบผลการคำนวณกับรุ่น GPU ที่บิลด์ด้วยคอมไพเลอร์เดียวกัน

mkdir build
cd build
CC=nvc CXX=nvc++ FC=nvfortran cmake \
  -DNVHPC_NO_ACC=ON \
  -DWITH_MPI=OFF -DWITH_OPENMP=ON \
  ..
make -j

วิธีการรัน

ขั้นตอนการรันบิลด์ GPU โดยพื้นฐานไม่ต่างจากกรณี CPU สำหรับขั้นตอนการรันทั่วไป โปรดดู คู่มือการรัน

การทำโปรไฟล์

สามารถเก็บข้อมูลโปรไฟล์ด้วย NVIDIA Nsight Systems (nsys)

ไม่มี MPI

nsys profile -t cuda -s none -o profile_result /path/to/FrontISTR/build/fistr1/fistr1

มี MPI

nsys profile -t cuda,mpi -s none -o profile_result \
  mpiexec -n <จำนวนโปรเซส> /path/to/FrontISTR/build/fistr1/fistr1 -t 8