Вопрос

Я использую расширения SSE, доступные в процессоре CORE2DUO (компилятор GCC 4.4.1). Я вижу, что доступно 16 регистров, каждый из которых длиной 128 бит. Теперь я могу вместить 4 целочисленные значения в один регистр, а 4 в другом регистре и использовании внутри, которые я могу добавить их в одну инструкцию. Очевидное преимущество так, как мне нужна только 1 инструкция вместо 4.

Мой вопрос: «Это все для SIMD?». Пусть у меня есть A1, A2, A3, A4, A5, A6, A7, A4 и B1, B2, B3, B4, B5, B6, B7, B8. Пусть A1, A2 - векторные регистры. Теперь A1 <<< (A1, A2, A3, A4) и B1 <<< (B1, B2, B3, B4) и Add (A1, B1) выполнит векторное дополнение.

Пусть A2 <<< (A5, A6, A7, A8), B2 <<< (B5, B6, B7, B8). Есть ли командная инструкция, которая может сделать добавление (A1, B1) и добавить (A2, B2) одновременно.

Сколько векторных функциональных единиц доступны в Core2duo и где я могу получить эту информацию?

Любой другой источник информации, связанных с этим, высоко ценится.

Это было полезно?

Решение

  • Нет, нет никаких единых инструкций SSE для этого. Вам нужно выпустить две инструкции. Вы думаете о чем-то вроде строковых инструкций X86 и префиксом REP? Там нет эквивалента SSE.

  • Две 4-разные векторные операции буду Существительно выполнены в том смысле, что все современные процессоры очень трубопроводные. Вторая команда будет снижаться на трубу только 1 цикл за первым (при условии, что они не взаимозависимы, что в вашем примере), поэтому их выполнение будет перекрываться во времени, за исключением того, что один цикл.

  • Каждый основной Из вашего многоядерного процессора есть собственный векторный функциональный блок. Вы должны написать многопоточный код, чтобы воспользоваться этим.

  • Некоторые процессоры имеют 1 векторную единицу на сердечник, у некоторых есть только 1/2! В последнем случае векторный блок составляет всего 64-бит, и только выполняет половину инструкции SSE одновременно. Ты получаешь то, за что платишь.

  • Вы должны посмотреть в AVX, новое расширение набора инструкций, которое развивает SSE для поддержки более широких векторных единиц.

  • Или вы могли бы посмотреть на реальное векторное программирование на GPU с OpenCL или CUDA.

Другие советы

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

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

begin C1 = A1 + B1
begin C2 = A2 + B2
wait
end C1 = A1 + B1
end C2 = A2 + B2

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

Вот более подробное объяснение трубопровода: http://en.wikipedia.org/wiki/instruction_pipeline.

Для помощи на программировании SIMD в целом, Страница SSE Apple довольно хорошо. Он несколько ориентирован на людей, мигрирующих приложения от PowerPC в SSE, но там тоже есть хорошая общая информация.

Сайт Intel содержит всю информацию, которую вы когда-либо понадобитесь!

http://www.intel.com/products/processor/manuals/

Отредактируйте в ответ на комментарий: вся информация находится в ссылках, связанных выше, но нет. Вы можете упаковать 8 16-битных целых чисел в 1 регистр и, таким образом, выполнять 8 одновременных добавок, но нет SSE не позволяет добавлять 2 регистров одновременно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top