Struktur von Arrays und Array von Strukturen - Leistungsunterschied

Ich habe eine Klasse wie diese:

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

Ich erstelle ein Array von Objekten vom Typ Einheit. Und Update auf sie aufrufen.

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

Um die Dinge zu beschleunigen und die Schleife möglicherweise automatisch zu überprüfen, habe ich AoS in eine Array-Struktur konvertiert.

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

Wenn die Schleife nicht automatisch überprüft werden kann, ist die Leistung für die Struktur von Arrays sehr schlecht. Bei 50 Einheiten ist das SoA-Update etwas schneller als AoS. Ab 100 Einheiten ist SoA jedoch langsamer als AoS. Mit 300 Einheiten ist SoA fast doppelt so schlecht. Mit 100K-Einheiten ist SoA 4x langsamer als AoS. Während Cache ein Problem für SoA sein könnte, habe ich nicht damit gerechnet, dass der Leistungsunterschied so hoch ist. Die Profilerstellung auf Cachegrind zeigt für beide Ansätze eine ähnliche Anzahl von Fehlern. Die Größe eines Unit-Objekts beträgt 48 Byte. L1-Cache ist 256 KB, L2 ist 1 MB und L3 ist 8 MB. Was vermisse ich hier? Ist das wirklich ein Cache-Problem?

Bearbeiten: Ich benutze gcc 4.5.2. Compiler-Optionen sind -o3 -msse4 -ftree-vectorize.

Ich habe ein weiteres Experiment in SoA durchgeführt. Anstatt die Arrays dynamisch zuzuweisen, habe ich "v" und "u" in der Kompilierzeit zugewiesen. Bei 100.000 Einheiten ist die Leistung 10-mal höher als bei der SoA mit dynamisch zugewiesenen Arrays. Was passiert hier? Warum gibt es einen solchen Leistungsunterschied zwischen statischem und dynamisch zugewiesenem Speicher?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage