Войти
ПрограммированиеФорумОбщее

SIMD оптимизации (27 стр)

Страницы: 122 23 24 25 26 27
#390
12:44, 15 дек. 2019

FordPerfect
> Есть такое
В статье пишут, что у них AVX в 1.6 быстрее, чем SSE и в 2 раза быстрее скалярной версии. Странно, получается, от SSE прирост всего 1.25. Обычно вроде SSE даёт прирост выше относительно скалярной версии, чем прирост от AVX относительно SSE.

FordPerfect
> Если меняются - матрицу, наверно, можно обновлять, непонятно, насколько это дорого.
Тогда прирост от SSE/NEON будет наверное ещё меньше, чем 1.25, если вообще будет. А ещё пишут, что там точность хуже и нужны даблы. А на наличие AVX я не особо рассчитываю, так как процессоры с AVX и без него быстрые и им оптимизация не нужна. Больше всего оптимизация нужна для старых бюджетных ARM и Intel Atom.

FordPerfect
}:+()___ [Smile]
> Но не уверен, что для таких мелких векторов будет эффективно.
Наверное всё же не стоит оно того, чтобы вникать в эти сложности. Остановлюсь на простом и понятном варианте - распараллелить то, что параллелится, а рекуррентную часть оставить последовательной.


#391
13:34, 15 дек. 2019

Тебе же вроде для синтезатора? Для синтезатора гораздо проще параллелится по голосам. Тогда не надо ломать голову над распихиванием - просто надо изначально все голосовые структуры делать для четверок голосов, делая каждый элемент в структуре учетверенным/SSE. При этом доступ к отдельному голосу не так уж и усложняется, если каждый член сделать в виде unnamed union из SSE и одиночного float. При необходимости работы с отдельным голосом просто брать указатель на всю структуру со смещением на 0, 4, 8 или 12 байт.

#392
(Правка: 14:02) 13:43, 15 дек. 2019

Dinosaur
> Если не пытаться комбинацию этих двух функций вручную инлайнить, то не лезет.
Если попробовать собрать из этого весь код, в целом это ни чего не меняет, на нем опять грыжа растет.

+ в идеале
#393
15:26, 15 дек. 2019

Dmitry_Milk
> Тебе же вроде для синтезатора? Для синтезатора гораздо проще параллелится по голосам.
Да, для синтезатора. По голосам я могу и так на разные ядра распараллелить. Не факт, что после этого останется ещё что параллелить на SIMD. Чтобы получить максимальный прирост от SSE/NEON и 4 ядер вместе, нужно будет, чтобы одновременно играло 16+ голосов, а это явно будет не всегда.

Dmitry_Milk
> Тогда не надо ломать голову над распихиванием - просто надо изначально все
> голосовые структуры делать для четверок голосов, делая каждый элемент в
> структуре учетверенным/SSE.
Я сейчас наоборот переделываю архитектуру синтезатора в сторону упрощения. А так придётся следить за тем, как собирать вместе по 4 одновременно играющих голоса, причём среди тех, которые считаются одним и тем же алгоритмом, а потом что-то делать с теми голосами, которые перестали играть раньше других. И векторность у меня нигде не торчит кроме как в самом вложенном цикле. На высоком уровне только соблюдается требование к выравниванию. А ещё я не представляю, как я буду читать по одному значению сразу из четырёх входных массивов x так, чтобы вложить это в один регистр и при этом не убить производительность.
К тому же половина инструментов обходится без этой рекуррентной зависимости, поэтому и так отлично ложится на SIMD.
В общем, получается очень сильное запутывание архитектуры всего синтезатора ради сомнительной оптимизации. И хорошо если при этом не появится оверхед для платформ, которые SIMD вообще не поддерживают.
У меня по сути есть функция-ядро синтеза, которая принимает структуру с параметрами, и в которой реализуется всё, что умеет делать синтезатор на низком уровне для синтеза одного голоса. И это ядро принимает шаблонные параметры, которые позволяют выборочно отключать некоторые фичи, чтобы ускорить инструменты, которым они не нужны. И я хочу сделать SIMD-версию этого ядра, API которой никак не отличается от скалярной версии кроме требований к выравниванию. Тогда можно выбирать между скалярной версией, SSE и AVX присвоением указателя на нужную функцию после проверки того, что поддерживает процессор.

Страницы: 122 23 24 25 26 27
ПрограммированиеФорумОбщее