2015-05-08 25 views
13

İşte bunu yapan ücretsiz işlevler vardır, ancak ilk durumda döngü vektörleştirilmez, ancak diğer durumlarda. Neden? derleyici (VS2013) denVektörizasyon neden hemen hemen aynı kod için farklı davranıyor?

#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; 
} 

ilgili mesajları:

açıklama kaynaktan
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 

nedeni 1200

@tony için: "Döngü vektörelleştirmeyi önlemek döngü taşınan veri bağımlılık durumu içerir. Döngünün farklı yinelemeleri, herbiri ile etkileşime girer, böylece döngüde vektörler yanlış cevaplar üretir ve otomatik vektörleştirici c annot, böyle bir veri yok bağımlılık olduğunu kanıtlamaktadır. " source

+2

Farklı bir derleyici deneyin? Diğerleri (gcc ve clang), tüm 3 fonksiyonu vectorize eder. –

+1

"Neden nedeni" 1200 olarak belgelendi? –

+1

Reason 1200: "Döngü, vektörleştirmeyi engelleyen, döngüde taşınan veri bağımlılıklarını içerir. Döngünün farklı yinelemeleri, birbirini engeller ve böylelikle, döngüyü vektörler yanlış yanıtlar üretir ve otomatik vektörleyici, bu tür veriler olmadığını kanıtlayamaz. dependences." [kaynak] (https://msdn.microsoft.com/en-us/library/jj658585.aspx#BKMK_ReasonCode120x) – Tony

cevap

-3

Ben her talimat ben gibi, bazı derin iç derleyici uygulama sorunu olduğunu tahmin const değişken k

+2

Bu açıkça doğru değil. – harold

+0

Üçüncü fonksiyonda sürekli değişen K'ye tekrarlı erişim hakkında ne düşünüyorsunuz? Ikincisi a.size() 'ye tekrarlanan çağrılar ne olacak? : P – hegel5000

2

getirmek zorundadır olarak SIMD amacını sınırlar değişken k const sayısız erişimi nedeniyle olduğunu düşünüyorum hangi aşamada auto-vectorizer "kick in" ve o anda kodun içsel temsilinin durumu nedir. MSVC2017'de denediğimde, bekleyeceği şeyle daha çok çalıştı. Bu otomatik vektörlü olarak belgelenen hattı 14 501 bir nedenle, ile, update() ve update3() ancak değilupdate2():

İndüksiyon değişken lokal değildir; veya üst sınır döngü değişmez değildir.

İlgili konular