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

Я использую расширения 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).

Обозначим A2 ‹*** (a5, a6, a7, a8), B2 ‹*** (b5, b6, b7, b8). Есть ли инструкция добавления, которая может добавлять (A1, B1) и добавлять (A2, B2) одновременно.

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

Мы высоко ценим любые другие источники информации, относящиеся к ним.


person anup    schedule 11.09.2010    source источник


Ответы (3)


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

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

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

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

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

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

person Die in Sente    schedule 11.09.2010

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

person celion    schedule 11.09.2010

На сайте Intel есть вся необходимая информация!

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

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

person Goz    schedule 11.09.2010
comment
Можете хотя бы дать ответ на первый вопрос? То есть может ли одна и та же инструкция добавления складывать два разных набора из 4 целых чисел. - person anup; 11.09.2010