2016-07-08 35 views
1

in einem schnellen attampt, habe ich versucht, AVX2-Daten (Typ __m256i) in einem Vektor zu speichern:store __m256i in std :: vector Erträgen Zugriffsverletzung nur im Release-Modus

__m256i values= _mm256_set_epi32(2, 4, 6, 8, 10, 12, 14, 16); 

std::vector<__m256i> vecValues; 

for (int k = 0; k < static_cast<int>(100); k++) 
{ 
    vecValues.push_back(values); 
} 

Mit VS2012, diesen Werken im Debug-Modus, aber geben Sie eine "Unhandled Ausnahme/Zugriffsverletzung" bei der Ausführung im Freigabemodus.

Kann jemand erklären, warum und wie die Daten korrekt speichern?

+0

Vielleicht ist Ihre Variable nicht richtig ausgerichtet? –

+2

Und selbst wenn Sie das tun könnten, macht das keinen Sinn. – harold

+1

@harold Ich mache diese Art von Sache sehr viel (als rohe Arrays, nicht std :: vector) in Routinen, die komplett um den SIMD-Typ herum entwickelt sind. – Mysticial

Antwort

3

Der __m256i Typ garantiert, dass eine bestimmte Ausrichtung beachtet werden, wenn auf dem Stapel für den Wertebereich zugeordnet werden. Allerdings ist die Ausrichtung Anmerkung * ignoriert, wenn man sie in einem std::vector setzen. Sie müssen einen benutzerdefinierten Zuordner verwenden, der die Ausrichtungsanforderungen berücksichtigt. Das wird die Verwendung des _mm_malloc intrinsischen oder rufen _aligned_malloc in MSVC wahrscheinlich einbeziehen.

__m256i erfordert eine 32-Byte-Ausrichtung, weil es die 256-Bit-Register AVX2 darstellt. Standardmäßig MSVC gibt Ihnen nur eine 8-Byte-Ausrichtung (für 32-Bit-Versionen) oder 16-Byte-Ausrichtung (für 64-Bit-Versionen), die nicht ausreichend ist. Dies führt zum Absturz der Zugriffsverletzung, wenn Sie versuchen, den Build auszuführen.

Donny-Dont has shared a Gist enthält ein Beispiel dafür, wie Sie einen benutzerdefinierten Alignment-aware-Zuordner zum Speichern von SIMD-Typen in einem STL-Container schreiben können. Sie sollten dies an Ihre eigenen Zwecke anpassen. Weitere Beispiele finden Sie in den Antworten auf this Stack Overflow question.

* GCC eine Kompilierung Zeit für diese emittieren Warnung:
warning: ignoring attributes on template argument '__m256i {aka __vector(4) long long int}'
, wenn Sie die -Wignored-attributes Option verwenden (die von -Wall impliziert). Ich sehe jedoch keine solche Warnung in Clang.