Ausrichtung von Heap-Arrays in C und C ++ auf Ease Compiler (GCC) Vektorisierung

8

Ich koche gerade eine Wrapper-Container-Template-Klasse für std::vector , die automatisch ein multi-resolution pyramid der Elemente in ihrem std::vector erstellt.

Das Schlüsselproblem besteht jetzt darin, dass ich möchte, dass die Pyramide (GCC) automatisch vektorisierbar wird.

Alle Datenarrays, die intern in dem std :: vector und in meiner Auflösungspyramide gespeichert sind, werden alle auf dem Heap unter Verwendung eines Standard-Neu- oder Zuordnungsvorlagenarguments erzeugt. Gibt es eine Möglichkeit? Ich kann dem Compiler helfen, eine bestimmte Ausrichtung auf meine Daten zu erzwingen, damit die Vektorisierung auf Elementen (Arrays) (Blöcken) mit optimaler Ausrichtung (typischerweise 16) funktionieren kann.

Ich verwende daher den benutzerdefinierten Zuordner AlignmentAllocator , aber die GCC-Auto-Vektorisierungsnachrichtenausgabe beansprucht immer noch nicht ausgerichteten Speicher in std::mr_vector::construct_pyramid Zeile 144 in multi_resolution.hpp enthält den Ausdruck

%Vor%

wie folgt

%Vor%

Kann ich irgendwie (stark) type-spezifizieren die Ausrichtung eines Pointer value aus memalign , so dass GCC kann sicher sein, dass die Region von data() weist die erforderliche Ausrichtung ( in diesem Fall 16)?

/ pro

Code für mr_vector Vorlagenklasse in multi_resolution.hpp :

%Vor%

und Code für benutzerdefinierten Zuordner AlignmentAllocator in allocators.hpp folgt:

%Vor%     
Nordlöw 06.07.2011, 14:46
quelle

3 Antworten

1

Da Sie die Vektorisierung verwenden, nehme ich an, dass dies eine Optimierung ist und dass es sich um große Arrays handelt. Warum sollten Sie in diesem Fall VirtualAlloc nicht verwenden und sicherstellen, dass Ihre Arrays in Vielfachen von 64k an einer 64k-Grenze ausgerichtet sind? Beispiel:

%Vor%

scheint mir etwas transparenter zu sein.

    
sqykly 18.09.2011 23:31
quelle
1

Könnte Ihre Antwort C ++ 11 scoped_allocator sein?

Damit können Sie einen Stateful-Allokator an die Elemente sowie einen Vektor übergeben. Verwenden Sie denselben benutzerdefinierten Zuordner für m_bot, m_datas, m_sizes, und für value_type.

Oder vielleicht bin ich verrückt und value_type bekommt / braucht keinen Allokator.

    
emsr 04.10.2011 20:23
quelle
1

Vielleicht sollten Sie Ihren eigenen Zuordner definieren, um den Standardzuordner zu ersetzen, damit Sie das gesamte Speicherlayout selbst steuern können.

    
yangrenyong 15.10.2011 14:19
quelle