2013-09-10 2 views
0

У меня вопрос об использовании 128-битных регистров для получения скорости в коде. Рассмотрим следующий код C/C++: я определяю два unsigned long long int s a и b и даю им некоторые значения.Побитовые операции между 128-битными целыми числами

unsigned long long int a = 4368, b = 56480; 

Тогда, я хочу, чтобы вычислить

a & b; 

Здесь a представлена ​​в компьютере в виде 64-разрядного числа 4369 = 100010001001, и то же самое для b = 56481 = 1101110010100001, и я вычисляю a & b, который до сих пор 64 -битовый номер задается бит за битом логическое и между а и Ь:

a & b = 1000000000001 

Мой вопрос заключается в следующем: есть компьютер s имеет 128-битный регистр, где я мог бы выполнить описанную выше операцию, но с целыми числами 128 бит, а не с 64-битными целыми числами и с тем же временем компьютера? Чтобы быть яснее: я хотел бы получить коэффициент в два раза в моем коде, используя 128-битные номера, а не 64-битные числа, например. г. Я хотел бы вычислить 128 AND, а не 64 AND (один AND для каждого бита) с тем же временем компьютера. Если это возможно, у вас есть пример кода? Я слышал, что регистраторы SSE могут это сделать, но я не уверен.

ответ

5

Да, SSE2 имеет побитовый бит 128 бит и вы можете использовать его с помощью встроенных функций на C или C++, например.

#include "emmintrin.h"   // SSE2 intrinsics 

__m128i v0, v1, v2;    // 128 bit variables 

v2 = _mm_and_si128(v0, v1);  // bitwise AND 

или вы можете использовать его непосредственно в ассемблере - инструкция PAND.

Вы можете даже сделать 256 бит И на Haswell и более поздние процессоры, которые имеют AVX2:

#include "immintrin.h"   // AVX2 intrinsics 

__m256i v0, v1, v2;    // 256 bit variables 

v2 = _mm256_and_si256(v0, v1); // bitwise AND 

Соответствующая инструкция в данном случае является VPAND.

+1

Дорогой Пол, благодарю вас за ваш ответ. Знаете ли вы, как конвертировать два 64-разрядных номера без знака long long int a, b в один номер __m128i? Я смотрю на руководство Intel, но я не могу его найти. Что касается регистра SSE2, могу ли я предположить, что у него все современные компьютеры? И мне нужно добавить флаг компиляции, чтобы включить SSE2? Спасибо – James

+0

@ user2138251 да все процессоры x86, так как первый, у которого есть набор команд SIMD, будет включать в себя набор команд для обратной совместимости. Таким образом, все процессоры Intel от Pentium 4 будут иметь SSE2. Вы даже можете выполнить 512-битные операции с AVX-512 в будущем –

+0

@ user2138251: вы можете использовать встроенный '_mm_set_epi64x' для загрузки 2 x 64-битных ints в 128-битный вектор. Любой процессор Intel/AMD с последних 10 лет или около того имеет минимум SSE2. Возможно, вам придется добавить '-msse2' в командную строку при компиляции. –

Смежные вопросы