Warum vektorisiert der Autovektorisierer von Visual C++ diese einfache Schleife nicht?

Warum vektorisiert der Autovektorisierer von Visual C++ diese einfache Schleife nicht?


Ich kann nicht herausfinden, warum Visual C++ diese Schleife nicht automatisch vektorisieren kann... irgendwelche Ideen?


Ich bekomme:


testvec.cpp:12: info C5002: loop not vectorized due to reason '1200'

wobei der Ursachencode 1200 lautet:



Aber warum?


#include <stdlib.h>
int main(int argc, char *argv[])
{
int const n = argc;
double
*const p1 = (double *)malloc(n * n * sizeof(*p1)),
*const p2 = (double *)malloc(n * n * sizeof(*p2));
for (int j = 0; j < n; ++j)
{
double const sj = p1[n * j];
for (int i = 0; i < n; ++i)
{
double const sum = p1[i] + sj, old = p1[i + n * j];
p2[i + n * j] = sum < old ? sum : old;
}
}
}

Antworten:


Endlich habe ich herausgefunden, wie ich es beheben kann ... scheint die Multiplikation in n * j zu sein ist der Übeltäter.

Hochziehen als int nj = n * j; und mit nj in der inneren Schleife behebt stattdessen das Problem.


Ich weiß immer noch nicht warum das passiert aber.


Wenn es jemand weiß, bitte posten!