Simd<T, N>
- Rust kursu
- Uzman
- Ders 20/46
- 4 dk
Simd<T, N> vektör türünü kullanırsın.
Simd<T, N>
std::simd'deki temel tür Simd<T, N>'dir: eleman türü T ve şerit sayısı N (const generic). f32x4 aslında Simd<f32, 4>'ün takma adıdır. Operatörler (+, *, -) şerit bazlı tanımlıdır:
use std::simd::Simd;
let a: Simd<f32, 8> = Simd::splat(1.0); // tüm şeritler 1.0
let b = Simd::<f32, 8>::splat(2.0);
let c = a + b; // 8 şerit 3.0Uygun şerit sayısı işlemciye bağlıdır: SSE 128 bit (4×f32), AVX2 256 bit (8×f32), AVX-512 512 bit (16×f32).
Kendi şerit türün
Aynı arayüzü const generic ve Add trait'iyle kararlı Rust'ta taklit edebiliriz:
#[derive(Clone, Copy)]
struct Seritler<const N: usize>([f32; N]);
impl<const N: usize> Seritler<N> {
fn yay(x: f32) -> Self { Seritler([x; N]) }
}
impl<const N: usize> std::ops::Add for Seritler<N> {
type Output = Self;
fn add(self, o: Self) -> Self {
Seritler(std::array::from_fn(|i| self.0[i] + o.0[i]))
}
}Şerit sayısının türde olması, farklı genişlikteki vektörlerin yanlışlıkla toplanmasını derleme anında engeller.
Uygulama Sekiz şerit
Yukarıdaki Seritler<const N: usize> türünü yay ve Add ile yaz. Seritler::<8>::yay(1.0) + Seritler::<8>::yay(2.0) sonucunun şerit sayısını ve şeritlerin toplamını boşlukla yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
#[derive(Clone, Copy)]
struct Seritler<const N: usize>([f32; N]);
impl<const N: usize> Seritler<N> {
fn yay(x: f32) -> Self {
Seritler([x; N])
}
}
impl<const N: usize> std::ops::Add for Seritler<N> {
type Output = Self;
fn add(self, o: Self) -> Self {
Seritler(std::array::from_fn(|i| self.0[i] + o.0[i]))
}
}
fn main() {
let c = Seritler::<8>::yay(1.0) + Seritler::<8>::yay(2.0);
let toplam: f32 = c.0.iter().sum();
println!("{} {}", c.0.len(), toplam);
}Beklenen çıktı
8 24
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>Simd::splat(1.0)</code> ne üretir?
- Tek elemanlı vektör
- Boş vektör
- 1.0'ın bitlerini
- Tüm şeritleri 1.0 olan bir vektör Doğru cevap
Açıklama: splat bir değeri tüm şeritlere "yayar"; sabitle çarpma gibi işlemlerde kullanılır.
2 Toplama operatörü
impl<const N: usize> std::ops::____ for Seritler<N> {
type Output = Self;
fn add(self, o: Self) -> Self { .. }
}
impl<const N: usize> std::ops::Add for Seritler<N> {
type Output = Self;
fn add(self, o: Self) -> Self { .. }
}
Açıklama: std::ops::Add + operatörünü tanımlar.
3 Genişlik ve şerit sayısı (f32)
| Kavram | Anlamı |
|---|---|
SSE (128 bit) |
4 |
AVX2 (256 bit) |
8 |
AVX-512 (512 bit) |
16 |
NEON (128 bit) |
4 şerit (ARM) |