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
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
:
und Code für benutzerdefinierten Zuordner AlignmentAllocator
in allocators.hpp
folgt:
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.
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.
Vielleicht sollten Sie Ihren eigenen Zuordner definieren, um den Standardzuordner zu ersetzen, damit Sie das gesamte Speicherlayout selbst steuern können.
Tags und Links c++ gcc memory-alignment dynamic-memory-allocation vectorization