Каков предел оптимизации с использованием SIMD? - PullRequest
5 голосов
/ 05 сентября 2010

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

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

Спасибо

Ответы [ 5 ]

4 голосов
/ 05 сентября 2010

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

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

4 голосов
/ 05 сентября 2010

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

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

3 голосов
/ 05 сентября 2010

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

2 голосов
/ 05 сентября 2010

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

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

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

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

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

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

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

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

...