Perché il vettorizzatore automatico di Visual C++ non vettorizza questo semplice ciclo?

Perché il vettorizzatore automatico di Visual C++ non vettorizza questo semplice ciclo?


Non riesco a capire perché Visual C++ non può vettorizzare automaticamente questo ciclo... qualche idea?


Ottengo:


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

dove il codice motivo 1200 è:



Ma perché?


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

Risposte:


Ho finalmente trovato come risolverlo... sembra la moltiplicazione in n * j è il colpevole.

Sollevandolo all'esterno come int nj = n * j; e usando nj nel ciclo interno invece risolve il problema.


Non so ancora perché questo succede però.


Se qualcuno lo sa, per favore lo pubblichi!