CodeBlanks Logo Icon CodeBlanks

std::simd

std::simd ile paket işlemlerine giriş yaparsın.

std::simd

SIMD (single instruction, multiple data), tek bir işlemci talimatıyla birden çok değeri aynı anda işler: 4 ya da 8 f32'yi tek seferde toplamak gibi. Rust'ta taşınabilir SIMD için std::simd modülü vardır, ancak hâlâ nightly'dedir (#![feature(portable_simd)]):

#![feature(portable_simd)]
use std::simd::f32x4;

let a = f32x4::from_array([1.0, 2.0, 3.0, 4.0]);
let b = f32x4::from_array([5.0, 6.0, 7.0, 8.0]);
let c = a + b;            // tek talimat: [6, 8, 10, 12]

Kararlı Rust'ta std::arch (platforma özgü talimatlar) ve derleyicinin otomatik vektörleştirmesi kullanılır. Alıştırmalarda şerit (lane) mantığını sabit boyutlu dizilerle kuracağız.

Şerit bazlı işlem

SIMD işlemleri şerit bazlıdır: i. sonuç yalnızca girdilerin i. elemanlarına bağlıdır. Aynı mantığı dizilerle yazmak derleyiciye vektörleştirme için temiz bir desen sunar:

fn topla4(a: [f32; 4], b: [f32; 4]) -> [f32; 4] {
    std::array::from_fn(|i| a[i] + b[i])
}

std::array::from_fn, her indeks için closure çağırarak sabit boyutlu bir dizi kurar; release derlemede bu genellikle tek bir SIMD toplama talimatına dönüşür.

Uygulama Dört şeritli toplama

Yukarıdaki topla4 fonksiyonunu yaz. [1.0, 2.0, 3.0, 4.0] ve [5.0, 6.0, 7.0, 8.0] için sonucu {:?} ile yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn topla4(a: [f32; 4], b: [f32; 4]) -> [f32; 4] {
    std::array::from_fn(|i| a[i] + b[i])
}

fn main() {
    println!("{:?}", topla4([1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0]));
}

Beklenen çıktı

[6.0, 8.0, 10.0, 12.0]

Soru ve cevaplar

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

1 SIMD hangi iş türünde en çok kazanç sağlar?

  • Büyük dizilerde aynı işlemin her elemana uygulandığı işler Doğru cevap
  • Dallanması çok kod
  • Ağ G/Ç'si
  • Tek değerli hesap

Açıklama: Görüntü işleme, ses, matris çarpımı, metin arama (memchr) tipik örneklerdir.

2 Diziyi kur

Soru
fn topla4(a: [f32; 4], b: [f32; 4]) -> [f32; 4] {
    std::array::____(|i| a[i] + b[i])
}
Cevap
fn topla4(a: [f32; 4], b: [f32; 4]) -> [f32; 4] {
    std::array::from_fn(|i| a[i] + b[i])
}

Açıklama: array::from_fn her indeks için closure'ı çağırıp bir dizi üretir.

3 Kavram ve anlamı

Kavram Anlamı
SIMD Tek talimat, çok veri
şerit (lane) Vektördeki tek eleman
f32x4 4 şeritli f32 vektörü
portable_simd Nightly özelliği

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