CodeBlanks Logo Icon CodeBlanks

Vectorization

SIMD vectorization ile otomatik paralelleştirmeyi öğrenirsin.

Vectorization

Vectorization, derleyicinin bir döngüyü SIMD (Single Instruction Multiple Data) komutlarına çevirmesidir. Tek bir komutla birden çok dizi elemanı işlenir; bu, hızda katkı sağlar.

Modern CPU'larda SSE/AVX kayıtcıları 4-16 int aynı anda işler. Derleyici -O3 ile otomatik vektörizasyon yapar. Engeller: işaretçi aliasing (iki işaretçi aynı belleğe işaret edebilir), döngü içinde koşul, karmaşık bağımlılıklar. __restrict__ anahtar kelimesi aliasing olmadığını söyler.

Vektörizasyona yardım

Derleyicinin döngüyü vektörize edebilmesi için: döngü basit olmalı (tek blok, koşul yok), döngü sayısı önceden bilinmeli (sabit veya n), işaretçiler ayrık olmalı (aliasing yok). int* __restrict__ a yazmak aliasing olmadığını bildirir.

Örnek: void add(int* __restrict__ a, int* b, int n) { for (int i = 0; i < n; ++i) a[i] += b[i]; }. Burada a ve b ayrık olduğu için derleyici her adımı güvenle SIMD ile işler. Vektörizasyon olmadan her adım tek tek işlenir; bu da yavaştır.

Uygulama Vektörize toplam yaz

int sum(int* a, int n) yaz. Gövdesi: int s = 0; for (int i = 0; i < n; ++i) s += a[i]; return s;. main içinde int a[4] = {1, 2, 3, 4}; tanımla ve std::cout << sum(a, 4); yaz.

Başlangıç kodu

main.cpp
#include <iostream>

// sum fonksiyonunu buraya tanımla

int main() {
    // a dizisini tanımla, sum'u çağır ve yazdır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>

int sum(int* a, int n) {
    int s = 0;
    for (int i = 0; i < n; ++i) s += a[i];
    return s;
}

int main() {
    int a[4] = {1, 2, 3, 4};
    std::cout << sum(a, 4);
    return 0;
}

Beklenen çıktı

10

Soru ve cevaplar

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

1 Parçayı rolüne eşle

Kavram Anlamı
SIMD Tek komut çok veri
#pragma omp simd OpenMP vektörizasyon
__restrict__ İşaretçi ayrıklığı
-O3 Vektörizasyon bayrağı

2 restrict anahtarını tamamla

Soru
void add(int* ________ a, int* b, int n) { for (int i = 0; i < n; ++i) a[i] += b[i]; }
Cevap
void add(int* __restrict__ a, int* b, int n) { for (int i = 0; i < n; ++i) a[i] += b[i]; }

Açıklama: __restrict__ aliasing olmadığını söyler.

3 -O3 hangi optimizasyonu etkinleştirir?

main.cpp
g++ -O3 main.cpp
  • Hiçbir şey
  • Yalnızca uyarılar
  • Agresif vektörizasyon ve döngü açma Doğru cevap
  • Aynı şey

Açıklama: -O3, -O2'ye ek olarak agresif vektörizasyon ve döngü açma yapar.

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