SIMD программирование - PullRequest
       0

SIMD программирование

1 голос
/ 11 сентября 2010

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

Мой вопрос: «Это все для SIMD?».Пусть у меня есть a1, a2, a3, a4, a5, a6, a7, a8 и b1, b2, b3, b4, b5, b6, b7, b8.Пусть A1, A2 - векторные регистры.Теперь A1 <<< (a1, a2, a3, a4) и B1 <<< (b1, b2, b3, b4) и add (A1, B1) выполнят сложение векторов. </p>

ПустьA2 <<< (a5, a6, a7, a8), B2 <<< (b5, b6, b7, b8).Существует ли инструкция добавления, которая может одновременно добавлять (A1, B1) и добавлять (A2, B2). </p>

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

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

Ответы [ 3 ]

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

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

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

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

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

  • Или вы можете изучить настоящее векторное программирование на GPU с OpenCL или Cuda.

0 голосов
/ 11 сентября 2010

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

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

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 в целом, Страница Apple SSE довольно хороша. Он в некоторой степени ориентирован на людей, которые переносят приложения из PowerPC в SSE, но там тоже есть хорошая общая информация.

0 голосов
/ 11 сентября 2010

Сайт Intel содержит всю необходимую информацию!

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

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

...