Обертка для "m256", создающая ошибку сегментации с конструктором-проблемы с Windows 64 + MinGW + AVX

у меня есть союз, который выглядит так

 union bareVec8f { 
    __m256 m256; //avx 8x float vector
    float floats[8];
    int ints[8];
    inline bareVec8f(){
    }
    inline bareVec8f(__m256 vec){
        this->m256 = vec;
    }
    inline bareVec8f &operator=(__m256 m256) {
        this->m256 = m256;
        return *this;
    }

    inline operator __m256 &() {
        return m256;
    }
}

__m256 должен быть выровнен по 32-байтовой границе для использования с функциями SSE и должен быть автоматически, даже в пределах объединения.

и когда я это делаю

bareVec8f test = _mm256_set1_ps(1.0f);

я получаю ошибку сегментации. Этот код должен работать из-за конструктора я сделал. Однако, когда я это делаю

bareVec8f test;
test.m256 = _mm256_set1_ps(8.f);

Я не получаю ошибку сегментации.

так потому что это работает отлично Союз вероятно, выровнен правильно, есть только некоторая ошибка сегментации, вызванная конструктором, кажется

я использую GCC 64bit компилятор windows

---------------------------------изменить Мэтту удалось привести самый простой пример ошибки, которая, похоже, происходит здесь.

#include <immintrin.h>

void foo(__m256 x) {}

int main()
{
    __m256 r = _mm256_set1_ps(0.0f);
    foo(r);
}

я компилирую с -std=c++11 -mavx

1 ответов


это ошибка в g++ для Windows. Он не выполняет 32-байтовое выравнивание стека, когда это необходимо. 49001 ошибка 54412 ошибка


On это так нити кто-то сделал скрипт Python для обработки выходных данных сборки g++, чтобы устранить проблему, так что это был бы один из вариантов.

в противном случае, чтобы избежать этого в вашем союзе, вы можете сделать функции, которые принимают __m256 по значению, возьмите его по ссылке. Это не должно имейте любой штраф за производительность, если оптимизация не низкая / выключена.

в случае, если вы не знаете - Объединение псевдонимов вызывает неопределенное поведение в C++, не разрешается писать m256 а потом читать floats или ints например. Поэтому, возможно, есть другое решение вашей проблемы.