Инструкции SSE - PullRequest
       25

Инструкции SSE

0 голосов
/ 06 декабря 2018

У меня вопрос по инструкции SSE.

Я надеюсь, что это правильное место, чтобы задать такой вопрос, если нет, пожалуйста, дайте мне знать, и я сниму этот вопрос.

Моя цельиспользовать инструкции SSE для параллельного выполнения вычислений по 3 символам.

У меня есть структура typedef, которая имеет атрибут, который упакован

typedef struct
{
        unsigned char x;
        unsigned char y;
        unsigned char z;
} __attribute__((packed)) Number;

Для каждого символа, который я должен пройтиопределенный расчет.

В качестве примера:

((Number[0].x * 20)  / 256);

Я должен сделать небольшой расчет для каждого символа и затем сложить их вместе.

Поскольку я должен написать код на ассемблере, я уже провел некоторое исследование и наткнулся на эту инструкцию:

__m128i _mm_add_epi8 (__m128i a, __m128i b)

Насколько мне известно, это должно добавить два значения (которые имеюткаждый размером 8 байт) вместе и сохраните результат.

По крайней мере, я так понимаю: По этой ссылке

Но так как мы добавляем только два значения вместеэто сводит на нет всю цель выполнения нескольких инструкций одновременно.

Любая помощь будет очень узкой.С уважением!

1 Ответ

0 голосов
/ 06 декабря 2018

Если бы вы могли предоставить больше информации о том, как вы на самом деле используете это, возможно, можно было бы лучше оптимизировать его, но, исходя из того, что вы написали, я думаю, вы бы хотели что-то вроде _mm_srli_epi32(_mm_mullo_epi32(_mm_set_epi32(n.x, n.y, n.z, 0), _mm_set1_epi32(20)), 8).Требуется SSE 4.1, но если вы хотите что-то, что работает для SSE 2, см. Умножение SSE на 4 32-разрядных целых числа для замены _mm_mullo_epi32.

Вы не указали, что выхотите сделать с результатом, но вы можете использовать что-то вроде ((int*) &r_sse)[i] для доступа к результатам, где i равно 1 для z, 2 для y и 1 для x.

...