Каков предел оптимизации с использованием SIMD?

Мне нужно оптимизировать некоторый код C, который выполняет множество физических вычислений, используя расширения SIMD на SPE процессора Cell. Каждый векторный оператор может обрабатывать 4 числа с плавающей запятой одновременно. Так что в идеале я бы ожидал 4-кратного ускорения в самом оптимистичном случае.

Как вы думаете, может ли использование векторных операторов дать большее ускорение?

Спасибо


person Open the way    schedule 05.09.2010    source источник


Ответы (5)


Лучшая оптимизация происходит при переосмыслении алгоритма. Удалите ненужные шаги. Найдите более прямой способ достижения того же результата. Вычислите решение в области, более релевантной проблеме.

Например, если векторный массив представляет собой список n, которые все находятся на одной линии, то достаточно преобразовать только конечные точки и интерполировать промежуточные точки.

person wallyk    schedule 05.09.2010
comment
Все это правильно, но ортогонально вопросу о том, что SIMD может сделать для вас... - person dmckee --- ex-moderator kitten; 05.09.2010
comment
что вы имеете в виду под словом «ортогональный»? - person Open the way; 06.09.2010

Это МОЖЕТ дать более высокую скорость, чем в 4 раза по сравнению с прямой плавающей запятой, поскольку инструкции SIMD могут быть менее точными (хотя и не настолько, чтобы создавать слишком много проблем) и поэтому для выполнения требуется меньше циклов. Это действительно зависит.

Лучший план — узнать как можно больше о процессоре, для которого вы оптимизируете. Вы можете обнаружить, что это может дать вам гораздо больше, чем 4-кратные улучшения. Вы можете узнать, что не можете. Однако мы не можем сказать, не зная больше об алгоритме, который вы оптимизируете, и о том, на какой ЦП вы ориентируетесь.

person Goz    schedule 05.09.2010
comment
Вы имеете в виду переход от двойной точности к одинарной? SSE2 и выше поддерживают двойную точность, а большинство платформ поддерживают IEEE или, по крайней мере, выполняют требования к точности… которые не таковы, чтобы делать арифметику с одним циклом редкостью. - person Potatoswatter; 05.09.2010
comment
Нет, не знаю. Я думаю о нескольких разных платформах, которые я использовал. Одним из них является x86, где использование скалярного SSE может быть во много раз быстрее, чем использование x87. В равной степени на одной платформе на основе MIPS параллельные инструкции выполняются быстрее, чем их скалярные аналоги, и даже в этом случае вы можете одновременно конвейеризировать стандартные скалярные и параллельные инструкции FPU. - person Goz; 05.09.2010
comment
Я так не думаю. Например, в PowerPC есть инструкции, которые только оценивают результат, что делает их намного быстрее, но вы теряете некоторую точность. - person Georg Schölly; 05.09.2010
comment
Я использую SPE сотового процессора - person Open the way; 05.09.2010
comment
@Werner: Если вы используете SPE, то AFAIK лучшее, что вы можете получить, - это 4-кратное ускорение, если вы не оптимизируете алгоритмически. - person Goz; 05.09.2010
comment
IIRC вы можете получить ускорение выше, чем 4x (для чисел с плавающей запятой) на SPE, даже если ширина SIMD равна 4. SPE может загружать только выровненные 16-байтовые блоки из своего локального хранилища, поэтому использование скаляров может генерировать дополнительные инструкции для извлечения невыровненного скаляр из выровненного блока и наоборот, если вы не будете осторожны (или компилятор может пропустить это, поместив скаляр в выровненный блок самостоятельно или сохранив его в регистре (конечно, это не то, что вы можете в общем рассчитываю)) - person Grizzly; 28.09.2010
comment
@Grizzly: я бы не назвал это ускорением в 4 раза, потому что, если вам нужно выполнять скалярные вычисления, то вам, очевидно, лучше всего использовать 16-байтовое выравнивание ваших скаляров ... Это вроде как сказать, что вы не получите Ускорение в 4 раза, потому что вам, возможно, придется иметь дело с невыровненными векторами .... это правда, но немного педантично;) - person Goz; 28.09.2010
comment
Я бы так не сказал, потому что во многих случаях у вас просто нет роскоши 16-байтового выравнивания ваших скаляров. В конце концов, многие ситуации, когда вы можете захотеть использовать simd, связаны с работой с большими наборами данных, где на самом деле нет возможности тратить большую часть пространства только на выравнивание (поскольку работа с выровненными по 16 байтам скалярами с плавающей запятой означает трату 3/4 пространства), особенно на спец, у которого изначально не так много локальной памяти. Поэтому я не думаю, что сравнивать невыровненные скаляры с выровненными векторами неправильно, поскольку это обычная ситуация. - person Grizzly; 28.09.2010

Сами по себе, нет. Но если процесс переписывания ваших алгоритмов для их поддержки также улучшит, скажем, локальность кеша или поведение ветвления, тогда вы можете обнаружить несвязанные ускорения. Впрочем, это относится к любой перезаписи...

person Oliver Charlesworth    schedule 05.09.2010
comment
Это несвязанное ускорение обычно называют ускорением суперлайнера. - person Dr. Snoopy; 05.09.2010

Это вполне возможно.

  • Вы можете сделать более умную микрооптимизацию на уровне инструкций, чем компилятор, если знаете, что делаете.
  • Большинство наборов инструкций SIMD предлагают несколько мощных операций, которые не имеют эквивалента в обычном скалярном коде FPU/ALU (например, PAVG/PMIN и т. д. в SSE2). Даже если они не совсем соответствуют вашей проблеме, вы часто можете комбинировать эти инструкции для достижения большего эффекта.
  • Не уверен насчет Cell, но большинство наборов инструкций SIMD имеют функции для оптимизации доступа к памяти, например для предварительной выборки данных в кэш. У меня были очень хорошие результаты с ними.

Это уже совсем не Cell и не PPC, а мой простой фильтр свертки изображений получил 20-кратное ускорение (C против SSE2) на Atom, что выше уровня параллелизма (16 пикселей за раз).

person dietr    schedule 05.09.2010

Это зависит от архитектуры. На данный момент я предполагаю архитектуру x86 (она же SSE).

Вы можете легко получить фактор четыре на узких петлях. Просто замените существующую математику инструкцией SSE, и все готово.

Вы даже можете получить немного больше, чем это, потому что, если вы используете SSE, вы выполняете математику в регистрах, которые обычно не используются компилятором. Это освобождает регистр общего назначения для других задач, таких как управление контуром и вычисление адреса. Короче говоря, код, окружающий инструкцию SSE, будет более компактным и выполняться быстрее.

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

person Nils Pipenbrinck    schedule 05.09.2010
comment
Я использую SPE сотового процессора - person Open the way; 05.09.2010
comment
О, вы работаете над SPE. Ну тут действуют совсем другие правила. вычислительная мощность редко является узким местом. Вместо этого задача состоит в том, чтобы вводить и выводить данные из SPU без задержек. Это нетривиально! - person Nils Pipenbrinck; 05.09.2010
comment
да, хотя в моем случае передача данных не проблема (занимает 5% времени) - person Open the way; 06.09.2010