std::simd
- Rust kursu
- Uzman
- Ders 19/46
- 4 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
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
fn topla4(a: [f32; 4], b: [f32; 4]) -> [f32; 4] {
std::array::____(|i| a[i] + b[i])
}
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 |