2015-05-08 20 views
13

Qui ci sono funzioni libere che fanno lo stesso, ma nel primo caso il ciclo non è vettorizzato ma negli altri casi lo è. Perché?Perché la vettorizzazione si comporta in modo diverso per quasi lo stesso codice?

#include <vector> 

typedef std::vector<double> Vec; 

void update(Vec& a, const Vec& b, double gamma) { 
    const size_t K = a.size(); 
    for (size_t i = 0; i < K; ++i) { // not vectorized 
     a[i] = b[i] * gamma - a[i]; 
    } 
} 

void update2(Vec& a, const Vec& b, double gamma) { 
    for (size_t i = 0; i < a.size(); ++i) { // vectorized 
     a[i] = b[i] * gamma - a[i]; 
    } 
} 

void update3(Vec& a, size_t K, const Vec& b, double gamma) { 
    for (size_t i = 0; i < K; ++i) { // vectorized 
     a[i] = b[i] * gamma - a[i]; 
    } 
} 

int main(int argc, const char* argv[]) { 
    Vec a(argc), b; 
    update(a, b, 0.5); 
    update2(a, b, 0.5); 
    update3(a, a.size(), b, 0.5); 
    return 0; 
} 

messaggi rilevanti dal compilatore (VS2013):

1> c:\home\dima\trws\trw_s-v1.3\trws\test\vector.cpp(7) : info C5002: loop not vectorized due to reason '1200' 
1> c:\home\dima\trws\trw_s-v1.3\trws\test\vector.cpp(13) : info C5001: loop vectorized 
1> c:\home\dima\trws\trw_s-v1.3\trws\test\vector.cpp(19) : info C5001: loop vectorized 

Dal commento di @tony

Motivo 1200: "Loop contiene dipendenze di dati di loop-effettuata che impediscono vettorializzazione. Diverse iterazioni del loop interferiscono con ciascuna in modo tale che la vettorizzazione del loop produce risposte errate e l'auto-vettorizzatore c annot dimostra a se stesso che non ci sono tali dipendenze ". source

+2

Provare un compilatore diverso? Altri (gcc e clang) rendono tutte le 3 funzioni. –

+1

Qual è la "ragione 1200" documentata come? –

+1

Motivo 1200: "Il loop contiene dipendenze di dati trasportate da loop che impediscono la vettorizzazione.Eterni iterazioni del loop interferiscono tra loro in modo tale che la vettorizzazione del loop produce risposte errate e l'auto-vettore non può dimostrare a se stesso che non ci sono tali dati dipendenze ". [fonte] (https://msdn.microsoft.com/en-us/library/jj658585.aspx#BKMK_ReasonCode120x) – Tony

risposta

-3

ritengo sia causa di numerosi accesso al const k variabile che limita lo scopo di SIMD come ogni istruzione deve recuperare la variabile const k

+2

Questo chiaramente non è vero. – harold

+0

Che dire dell'accesso ripetuto a K in continua evoluzione nella terza funzione? Per quanto riguarda le chiamate ripetute a 'a.size()' nella seconda? : P – hegel5000

2

Credo sia qualche problema profondamente interna attuazione compilatore, come in quale fase l'auto-vettore "kick in" e qual è lo stato della rappresentazione interna del codice in quel momento. Quando ho provato su MSVC2017, ha funzionato più in linea con quello che ci si aspetterebbe. Si auto-vectorized update() e update3(), ma non update2(), con la ragione data 501 per la linea 14, che è documentata come:

variabile induzione non è locale; o il limite superiore non è invariante del ciclo.

Problemi correlati