Estructura de matrices y matriz de estructuras - diferencia de rendimiento

Tengo una clase como esta:

//Array of Structures
class Unit
{
  public:
    float v;
    float u;
    //And similarly many other variables of float type, upto 10-12 of them.
    void update()
    {
       v+=u;
       v=v*i*t;
       //And many other equations
    }
};

Creo una matriz de objetos de tipo de unidad. Y llamar a la actualización sobre ellos.

int NUM_UNITS = 10000;
void ProcessUpdate()
{
  Unit *units = new Unit[NUM_UNITS];
  for(int i = 0; i < NUM_UNITS; i++)
  {
    units[i].update();
  }
}

Con el fin de acelerar las cosas, y posiblemente autovectorizar el bucle, convertí AoS en estructura de arreglos.

//Structure of Arrays:
class Unit
{
  public:
  Unit(int NUM_UNITS)
  {
    v = new float[NUM_UNITS];
  }
  float *v;
  float *u;
  //Mnay other variables
  void update()
  {
    for(int i = 0; i < NUM_UNITS; i++)
    {
      v[i]+=u[i];
      //Many other equations
    }
  }
};

Cuando el bucle no se automatiza, obtengo un rendimiento muy malo para la estructura de los arreglos. Para 50 unidades, la actualización de SoA es un poco más rápida que AoS. Pero a partir de 100 unidades, SoA es más lenta que AoS. Con 300 unidades, SoA es casi el doble de peor. En unidades de 100K, SoA es 4x más lento que AoS. Si bien la memoria caché puede ser un problema para SoA, no esperaba que la diferencia de rendimiento fuera tan alta. El perfilado en cachegrind muestra un número similar de fallos para ambos enfoques. El tamaño de un objeto unitario es de 48 bytes. El caché L1 es 256K, L2 es 1MB y L3 es 8MB. que me estoy perdiendo aqui? ¿Es esto realmente un problema de caché?

Editar: Estoy usando gcc 4.5.2. Las opciones del compilador son -o3 -msse4 -ftree-vectorize.

Hice otro experimento en SoA. En lugar de asignar dinámicamente las matrices, asigné "v" y "u" en tiempo de compilación. Cuando hay 100K unidades, esto da un rendimiento 10 veces más rápido que el SoA con arreglos asignados dinámicamente. ¿Que esta pasando aqui? ¿Por qué hay tal diferencia de rendimiento entre la memoria asignada de forma dinámica y estática?

Respuestas a la pregunta(4)

Su respuesta a la pregunta