Hier sind freie Funktionen, die das gleiche tun, aber im ersten Fall ist die Schleife nicht vektorisiert, aber in den anderen Fällen ist es. Warum das?Warum verhält sich die Vektorisierung bei fast demselben Code anders?
#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;
}
Relevante Nachrichten vom Compiler (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
Von Kommentar von @tony
Reason 1200: „Loop enthält schleifengeführte Datenabhängigkeiten, die Vektorisierung verhindern. Verschiedene Wiederholungen der Schleife interferieren mit jedem anderen, so dass die Vektorisierung der Schleife falsche Antworten erzeugen würde, und der Auto-Vektorisierer c Annot beweisen, dass es solche Daten Abhängigkeiten nicht gibt. " source
Versuchen Sie einen anderen Compiler? Andere (gcc und clang) vektorisieren alle 3 Funktionen. –
Was ist "Grund 1200" dokumentiert? –
Grund 1200: "Schleife enthält Schleifen-getragene Datenabhängigkeiten, die Vektorisierung verhindern. Verschiedene Iterationen der Schleife interferieren miteinander, so dass eine Vektorisierung der Schleife falsche Antworten erzeugen würde, und der Auto-Vektorisierer kann sich selbst nicht beweisen, dass solche Daten nicht existieren Abhängigkeiten. " [Quelle] (https://msdn.microsoft.com/en-us/library/jj658585.aspx#BKMK_ReasonCode120x) – Tony