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

StackOverflow https://stackoverflow.com/questions/3646986

  •  01-10-2019
  •  | 
  •  

Вопрос

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

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

Спасибо

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Это все возможное.

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top