Сохранить __m256i в целое число

Как я могу сохранить тип данных __m256i в целое число?

Я знаю, что для поплавков есть:

_mm256_store_ps(float *a, __m256 b)

где первый аргумент - это выходной массив.

Для целых чисел я нашел только:

_mm256_store_si256(__m256i *a, __m256i b)

где оба аргумента имеют тип данных __m256i.

Достаточно ли сделать что-то вроде этого:

int * X = (int*) _mm_malloc( N * sizeof (*X) ,32 );

(Я использую это как аргумент функции, и я хочу получить ее значения)

Внутренняя функция:

__m256i * Xmmtype = (__m256i*) X;

//fill output
_mm256_store_si256( &Xmmtype[ i ] , T ); //T is __m256i

Это нормально?

-----ОБНОВЛЕНО -----------------------

Хорошо, а что если у меня:

__m256i T;

for ( y = 0; y < h; y++ )
{ 
    for ( x = 0; x < w; x++ )
    {
        for ( int i = 0; i < N; i+=8 )
        {
            //calculate here the  T

        } 

        //write result
        _mm256_store_si256( &Xmmtype[ x + y * w ] , T );


    } 

} 

person George    schedule 08.04.2015    source источник


Ответы (1)


То, что вы сделали, в порядке, но вам не нужно создавать временный указатель — вы можете просто применить приведение напрямую, например:

_mm256_store_si256( (__m256i *)X, T );

or:

_mm256_store_si256( (__m256i *)&X[i], T );


Обновление на основе последней редакции вашего вопроса:

Похоже, вы индексируете X таким образом, который не соответствует требованиям выравнивания AVX, т. е. X[i] не гарантируется выравниванием по 32 байтам, поэтому вам следует использовать невыровненное хранилище:

_mm256_storeu_si256( (__m256i *)&X[i], T );
person Paul R    schedule 08.04.2015
comment
:Здравствуйте, это дает мне ошибку сегментации при приведении. - person George; 08.04.2015
comment
Вероятно, это другая проблема - вам нужно убедиться, что X (или &X[i]) выровнено по 32 байтам, или использовать _mm256_storeu_si256 вместо _mm256_store_si256, если вы не можете гарантировать выравнивание. - person Paul R; 08.04.2015
comment
Я использовал _mm_malloc( N * sizeof (*X) ,32 ). Он выровнен по 32, верно? Я также попробую магазин и дам вам знать. (Я смогу проверить его на следующей неделе) - person George; 09.04.2015
comment
Если вы используете X[i], то i должно быть кратно 8, чтобы сохранить выравнивание. - person Paul R; 09.04.2015