У меня вопрос об использовании 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 могут это сделать, но я не уверен.
Дорогой Пол, благодарю вас за ваш ответ. Знаете ли вы, как конвертировать два 64-разрядных номера без знака long long int a, b в один номер __m128i? Я смотрю на руководство Intel, но я не могу его найти. Что касается регистра SSE2, могу ли я предположить, что у него все современные компьютеры? И мне нужно добавить флаг компиляции, чтобы включить SSE2? Спасибо – James
@ user2138251 да все процессоры x86, так как первый, у которого есть набор команд SIMD, будет включать в себя набор команд для обратной совместимости. Таким образом, все процессоры Intel от Pentium 4 будут иметь SSE2. Вы даже можете выполнить 512-битные операции с AVX-512 в будущем –
@ user2138251: вы можете использовать встроенный '_mm_set_epi64x' для загрузки 2 x 64-битных ints в 128-битный вектор. Любой процессор Intel/AMD с последних 10 лет или около того имеет минимум SSE2. Возможно, вам придется добавить '-msse2' в командную строку при компиляции. –