STREAM kullanarak ilk karşılaştırmanızı çalıştırma

STREAM, işlemsel akışkan dinamiği (CFD), sonlu öğe analizi ve veri analizi gibi belleğe bağlı iş yükleri için kritik öneme sahip sürdürülebilir bellek bant genişliğini ölçer. STREAM, dört vektör işlemi için bellek bant genişliğini ölçen basit, yapay bir karşılaştırmadır:

Operation Description Formula
Kopyala Aktarım oranlarını ölçer a(i) = b(i)
Ölçek Basit aritmetik ekler a(i) = q × b(i)
Ekle Birden çok yükleme/depolama işlemi a(i) = b(i) + c(i)
Triad En çok temsili a(i) = b(i) + q × c(i)

Triad sonucu, sistemler arasında bellek bant genişliğini karşılaştırmaya yönelik standart ölçümdür.

Tamamlanma süresi: 15-20 dakika

Önkoşullar

  • Azure HPC VM (HBv3, HBv4, HBv5 veya HX serisi önerilir)
  • VM'ye SSH erişimi
  • Kök veya sudo ayrıcalıkları

Tip

En iyi sonuçlar için, iyileştirilmiş derleyiciler ve kitaplıklar içeren Azure HPC market görüntülerini (AlmaLinux-HPC veya Ubuntu-HPC) kullanın.

VM ailesine göre beklenen sonuçlar

Sonuçlarınızı doğrulamak için şu değerleri kullanın:

VM Serisi STREAM Triad (GB/sn) Notes
HBv5 (HBM ile) Yaklaşık 7.000 HBM belleği kullanır
HBv4 ~650-780 DDR5 bellek
HBv3 ~330-350 DDR4 bellek
HBv2 ~260 DDR4 bellek

Sonuçlarınız önemli ölçüde daha düşükse (aşağıda 10'dan fazla%), yapılandırmanızı denetleyin.

1. Adım: VM'nize bağlanma

SSH aracılığıyla HPC VM'nize bağlanın:

ssh azureuser@<vm-public-ip>

Veya bir küme kullanıyorsanız Slurm oturum açma düğümünüzü kullanarak bağlanın.

2. Adım: Bağımlılıkları yükleme

Azure HPC görüntüleri gerekli derleyicileri içerir. GCC'nin kullanılabilir olduğunu doğrulayın:

gcc --version

Seçenek B: El ile yükleme

Standart bir görüntü kullanıyorsanız derleme araçlarını yükleyin:

# AlmaLinux/RHEL
sudo dnf groupinstall "Development Tools" -y

# Ubuntu
sudo apt update && sudo apt install build-essential -y

3. Adım: STREAM'i indirme ve derleme

İyileştirilmiş STREAM yapılandırmalarını içeren Azure karşılaştırma deposunu kopyalayın:

# Create working directory
mkdir -p ~/benchmarks && cd ~/benchmarks

# Clone Azure benchmarking repository
git clone https://github.com/Azure/woc-benchmarking.git
cd woc-benchmarking/apps/hpc/stream

Alternatif olarak STREAM'i doğrudan indirin:

mkdir -p ~/benchmarks/stream && cd ~/benchmarks/stream
wget https://www.cs.virginia.edu/stream/FTP/Code/stream.c

AMD EPYC işlemcileri için iyileştirmelerle derleme (HB serisinde kullanılır):

gcc -O3 -march=znver3 -fopenmp -DSTREAM_ARRAY_SIZE=800000000 \
    -DNTIMES=20 stream.c -o stream

Derleyici bayrakları açıklandı:

Flag Amaç
-O3 En yüksek iyileştirme düzeyi
-march=znver3 AMD Zen 3/4 mimarisi için iyileştirme
-fopenmp OpenMP'yi çoklu iş parçacığı oluşturma için etkinleştir
-DSTREAM_ARRAY_SIZE=800000000 Dizi boyutu (dizi başına~6 GB, toplam 18 GB)
-DNTIMES=20 Yineleme sayısı

Önemli

Dizi boyutu, verilerin önbelleğe sığmayacak kadar büyük olması gerekir. 1,5 GB L3 önbelleğe sahip HBv4/HBv5 için en az 800M öğe kullanın.

4. Adım: İş parçacığı bağlılığını yapılandırma

Doğru iş parçacığı sabitleme, doğru sonuçlar için kritik öneme sahiptir. OpenMP ortam değişkenlerini ayarlayın:

# Get number of physical cores
NCORES=$(lscpu | grep "^Core(s) per socket:" | awk '{print $4}')
NSOCKETS=$(lscpu | grep "^Socket(s):" | awk '{print $2}')
TOTAL_CORES=$((NCORES * NSOCKETS))

echo "Total physical cores: $TOTAL_CORES"

# Set OpenMP configuration
export OMP_NUM_THREADS=$TOTAL_CORES
export OMP_PROC_BIND=spread
export OMP_PLACES=cores

HBv4 için (176 çekirdek):

export OMP_NUM_THREADS=176
export OMP_PROC_BIND=spread
export OMP_PLACES=cores

HBv5 için (standart yapılandırma):

export OMP_NUM_THREADS=176
export OMP_PROC_BIND=spread
export OMP_PLACES=cores

5. Adım: Karşılaştırmayı çalıştırma

STREAM komutunu yürüt.

./stream

Örnek çıkış (HBv4):

-------------------------------------------------------------
STREAM version $Revision: 5.10 $
-------------------------------------------------------------
This system uses 8 bytes per array element.
-------------------------------------------------------------
Array size = 800000000 (elements), Offset = 0 (elements)
Memory per array = 6103.5 MiB (= 5.96 GiB).
Total memory required = 18310.5 MiB (= 17.88 GiB).
Each kernel will be executed 20 times.
-------------------------------------------------------------
Number of Threads requested = 176
Number of Threads counted = 176
-------------------------------------------------------------
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:          753284.2     0.017157     0.016966     0.018884
Scale:         707935.3     0.018260     0.018045     0.019629
Add:           756972.9     0.025508     0.025318     0.027311
Triad:         757820.9     0.025464     0.025290     0.027212
-------------------------------------------------------------

En İyi Triad Oranı (757.820,9 MB/sn = ~740 GB/sn) en önemli sonuçdur.

6. Adım: Sonuçları doğrulama

Triad sonucunuzu beklenen değerlerle karşılaştırın:

# Quick validation script
TRIAD_RESULT=757820  # Replace with your result in MB/s
VM_TYPE="HBv4"       # HBv2, HBv3, HBv4, or HBv5

case $VM_TYPE in
    "HBv5") EXPECTED=7000000 ;;
    "HBv4") EXPECTED=700000 ;;
    "HBv3") EXPECTED=330000 ;;
    "HBv2") EXPECTED=260000 ;;
esac

PERCENT=$(echo "scale=1; $TRIAD_RESULT * 100 / $EXPECTED" | bc)
echo "Achieved $PERCENT% of expected bandwidth"

Sonuçların yorumlanması:

Başarı Yorumlama
95-105% Mükemmel - VM beklendiği gibi çalışıyor
85-95% İyi - Küçük iyileştirme mümkün
70-85% Araştır - İş parçacığı bağdaşımını ve NUMA'yı denetle
<70% Sorun - Yapılandırmayı denetleme

7. Adım: Birden çok NUMA etki alanında çalıştırma (gelişmiş)

Ayrıntılı NUMA analizi için NUMA etki alanı başına STREAM komutunu çalıştırın:

# Check NUMA topology
numactl --hardware

# Run on NUMA node 0 only
numactl --cpunodebind=0 --membind=0 \
    OMP_NUM_THREADS=22 OMP_PROC_BIND=spread OMP_PLACES=cores ./stream

# Run on all NUMA domains (default full-node run)
numactl --interleave=all \
    OMP_NUM_THREADS=176 OMP_PROC_BIND=spread OMP_PLACES=cores ./stream

Sorun giderme

Düşük bant genişliği sonuçları

Belirti: Sonuçlar beklenen değerlerin önemli ölçüde altında

Çözümler:

  1. İş parçacığı sayısını denetleyin:

    echo $OMP_NUM_THREADS
    # Should match physical core count
    
  2. İş parçacığını bağlamayı doğrulayın

    export OMP_DISPLAY_ENV=TRUE
    ./stream 2>&1 | head -20
    
  3. CPU sıklığı ölçeklendirmesini denetleyin:

    cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
    # Should be "performance" for benchmarking
    
  4. NUMA bellek ilkesini doğrulayın:

    numactl --show
    

Dizi boyutu çok küçük

Belirti: Beklenenden yüksek sonuçlar (belleği değil önbelleği ölçme)

Çözüm: Derleme zamanında STREAM_ARRAY_SIZE artırın. Kullanılan toplam bellek en az 4× L3 önbellek boyutu olmalıdır.

# Recompile with larger array
gcc -O3 -march=znver3 -fopenmp -DSTREAM_ARRAY_SIZE=1000000000 \
    -DNTIMES=20 stream.c -o stream

Tutarsız sonuçlar

Belirti: Çalıştırmalar arasında büyük varyasyon

Çözümler:

  1. Başka hiçbir işlemin çalışmadığından emin olun:

    top -b -n 1 | head -20
    
  2. Daha fazla yineleme çalıştırın:

    # Recompile with more iterations
    gcc -O3 -march=znver3 -fopenmp -DSTREAM_ARRAY_SIZE=800000000 \
        -DNTIMES=50 stream.c -o stream
    

Slurm işinde STREAM çalıştırma

Slurm kümesi kullanıyorsanız bir iş betiği oluşturun:

cat << 'EOF' > stream-job.sh
#!/bin/bash
#SBATCH --job-name=stream
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=176
#SBATCH --time=00:10:00
#SBATCH --partition=hpc
#SBATCH --exclusive

# Set thread configuration
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
export OMP_PROC_BIND=spread
export OMP_PLACES=cores

# Run STREAM
cd ~/benchmarks/woc-benchmarking/apps/hpc/stream
./stream
EOF

sbatch stream-job.sh

Azure karşılaştırma betikleriyle otomatikleştirme

Azure woc-benchmarking deposu otomasyon betiklerini içerir:

cd ~/benchmarks/woc-benchmarking/apps/hpc/stream

# View available scripts
ls -la

# Run automated benchmark (if available)
./run_stream.sh