2016-07-30 17 views
-1

ich die beiden folgenden Schleifen haben:Vektorisierung in Schleifen

For i=1…n 
    a[i] = a[i+1] + 1 

For i=1…n 
    b[i] = b[i-1] + 1 

nun bedenkt, dass sowohl die Arrays initialisiert werden, welche von ihnen vektorisiert werden können? Ändert sich auch die Antwort, wenn die Arrays nicht initialisiert werden, denn wenn die Werte nicht initialisiert werden, dann wird in der ersten Schleife ein [i + 1] benötigt, bevor es berechnet wird.

edit1: Die Schleifen hier versuchen, 4 Bytes zu einer Zeit zu kopieren, wenn ich 16 Bytes gleichzeitig kopieren möchte, kann es getan werden? Gibt es eine Zurückhaltung dafür?

+0

Dies ist nicht C++ - Code, was auch immer Sie fragen. –

+0

Für den Rekord versuchen Sie zu bestimmen, was ein Compiler tun wird, oder warum es das tun wird, weil Letzteres ein bisschen eine Hausaufgabenfrage ist. – West

+0

Wenn Sie sich den Artikel zur automatischen Vektorisierung anschauen, hat er Optionen dafür. – West

Antwort

2
void test2(int* A, int Length){ 
for (int i = 0; i+1 < Length; i++) { 
     A[i] = A[i+1] + 1; 
    } 
} 

void test3(int* A, int Length){ 
for (int i = 1; i < Length; i++) { 
     A[i] = A[i-1] + 1; 
    } 
} 

Gibt das Ergebnis

vector.cpp:12:14: remark: vectorized loop (vectorization width: 4, interleaved count: 2) [-Rpass=loop-vectorize] 
     A[i] = A[i+1] + 1; 
      ^
vector.cpp:18:17: remark: vectorized loop (vectorization width: 4, interleaved count: 2) [-Rpass=loop-vectorize] 
     A[i] = A[i-1] + 1; 

mit dieser Befehlszeile clang++-3.8 -O3 -Rpass=loop-vectorize vector.cpp So Klirren nach sie beide automatisch auf O3

Start hier Auto-Vectorization

Edit: Noch besser here ist ein Blogpost mit Beispielen

Verwandte Themen