Вопрос
Я использую расширения 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 регистров одновременно.