Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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
Seçenek A: Azure HPC görüntülerini kullanma (önerilir)
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:
İş parçacığı sayısını denetleyin:
echo $OMP_NUM_THREADS # Should match physical core countİş parçacığını bağlamayı doğrulayın
export OMP_DISPLAY_ENV=TRUE ./stream 2>&1 | head -20CPU sıklığı ölçeklendirmesini denetleyin:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor # Should be "performance" for benchmarkingNUMA 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:
Başka hiçbir işlemin çalışmadığından emin olun:
top -b -n 1 | head -20Daha 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