CodeBlanks Logo Icon CodeBlanks

Özet - SIMD

Simd<T, N> ve Mask'ı birleştirerek bir vektör toplamı yazarsın.

SIMD özeti

SIMD tek talimatla birden çok şeridi işler. std::simd (Simd<T, N>, maskeler, reduce_*) taşınabilir ama nightly'dir; kararlı seçenekler std::arch ve otomatik vektörleştirmedir. Dikey işlemler şerit bazlı, yatay işlemler şeritleri indirger. Maske + select dallanmasız koşul sağlar. Otomatik vektörleştirme için: sınır denetimsiz erişim, çoklu birikim, dallanmasız gövde; daha geniş vektörler için target-cpu ya da #[target_feature].

Dört birikimli nokta çarpımı

Dikey çarp-topla, sonda tek bir yatay indirgeme ve artanların ayrı işlenmesi:

fn nokta4(a: &[f32], b: &[f32]) -> f32 {
    assert_eq!(a.len(), b.len());
    let mut birikim = [0.0f32; 4];
    for (x, y) in a.chunks_exact(4).zip(b.chunks_exact(4)) {
        for i in 0..4 { birikim[i] += x[i] * y[i]; }
    }
    let n = a.len() / 4 * 4;
    let kalan: f32 = a[n..].iter().zip(&b[n..]).map(|(x, y)| x * y).sum();
    birikim.iter().sum::<f32>() + kalan
}

Uygulama Hızlı nokta çarpımı

Yukarıdaki nokta4 fonksiyonunu yaz. a 1'den 10'a kadar sayılar (f32), b on adet 1.0 olsun; sonucu yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
fn nokta4(a: &[f32], b: &[f32]) -> f32 {
    assert_eq!(a.len(), b.len());
    let mut birikim = [0.0f32; 4];
    for (x, y) in a.chunks_exact(4).zip(b.chunks_exact(4)) {
        for i in 0..4 {
            birikim[i] += x[i] * y[i];
        }
    }
    let n = a.len() / 4 * 4;
    let kalan: f32 = a[n..].iter().zip(&b[n..]).map(|(x, y)| x * y).sum();
    birikim.iter().sum::<f32>() + kalan
}

fn main() {
    let a: Vec<f32> = (1..=10).map(|x| x as f32).collect();
    let b = vec![1.0f32; 10];
    println!("{}", nokta4(&a, &b));
}

Beklenen çıktı

55

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Nokta çarpımında 4 ayrı birikim kullanmak neden hızlıdır?

  • Daha az bellek kullanır
  • Daha doğrudur
  • Hızlı değildir
  • Bağımsız zincirler aynı anda ilerler ve 4 şeritli bir vektöre doğrudan eşlenir Doğru cevap

Açıklama: Tek birikimde her toplama bir öncekini bekler; dört birikim gecikmeyi gizler.

2 Parçaları eşle

Soru
for (x, y) in a.chunks_exact(4).____(b.chunks_exact(4)) {
    for i in 0..4 { birikim[i] += x[i] * y[i]; }
}
Cevap
for (x, y) in a.chunks_exact(4).zip(b.chunks_exact(4)) {
    for i in 0..4 { birikim[i] += x[i] * y[i]; }
}

Açıklama: zip iki dilimin aynı konumdaki parçalarını eşler.

3 Grubun özeti

Kavram Anlamı
Simd<T, N> N şeritli vektör
Mask + select Dallanmasız koşul
reduce_sum Yatay toplam
Çoklu birikim Vektörleşme dostu

Uzman bölümündeki tüm dersler