Vectorization
- C++ kursu
- Uzman
- Ders 27/47
- 5 dk
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
#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
#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
void add(int* ________ a, int* b, int n) { for (int i = 0; i < n; ++i) a[i] += b[i]; }
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?
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.