CodeBlanks Logo Icon CodeBlanks

Simd<T, N>

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.0

Uygun ş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

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

Örnek çözüm

main.rs
#[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ü

Soru
impl<const N: usize> std::ops::____ for Seritler<N> {
    type Output = Self;
    fn add(self, o: Self) -> Self { .. }
}
Cevap
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)

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