LINUX.ORG.RU

Чо за проблемы с AVX-512?

 , , , ,


0

2

Привет! Мне тут короче понадобилось двумерную карту флоатов в картинку, по заданной палитре, преобразовать. Если че, это видеостриминг в реалтайме.

Ну я недолго думая привинтил SSE, потом еще подумал, и прикрутил FMA3 инструкции, для более лучшей интерполяции, и для перевода сразу в YUV(линейное преобразование, умножение матрицы на вектор, то сё).

Потом еще подумал, а что это я только по 4 точки прохожу? Вобщем можно и по 8 если AVX. А то и по 16 если AVX-512.

Но тут почитал, что AVX, и особенно AVX-512 делают какую-то черную магию с процессорами, при излишнем использовании. Типа ядра замедляют или чето такое. Поясните че как? Стоит туда жать?

★★

AVX очень «горячие» инструкции, из-за чего проц нехило сбрасывает частоты при их использовании.

Deleted
()
Ответ на: комментарий от lovesan

Вот возьми померяй, потом нам расскажешь, есть ли смысл

Deleted
()

ЕМНИП, на многих процах есть пенальти, если с них переходишь опять на legacy SSE. А всякую чушь про «сброс частот» не слушай вообще

deadplace
()

Вопрос лавсану и другим. Можно ли с помощью с помощью шланга работать с 3-х или 4-х векторами из синглов по типу как это сделано в OpenCL? Типа иметь функции select, min, max, итд., умножать, складывать вектора. Чтобы это всё компилялось в эффективный код

deadplace
()
Ответ на: комментарий от lovesan

Это слишком низкоуровневая фигня. Сейчас мне приходится для некоторых функций иметь 2 варианта — с SSE-шнягой из этих хедеров и «обычный», где я работаю с массивами. А хотелось бы более кроссплатформенно и высокоуровнево. Чтобы если на машине нет SIMD-инструкций компилялся «обычный» код, если есть — SIMD

deadplace
()

Кстати, а почему ты не дал сорс своего чтива, а то похоже на обычный вброс

deadplace
()
Ответ на: комментарий от deadplace

Так для высокоуровневости все умеют правильно написанные циклы против массививов в векторизированные инструкции переделывать и жаба, и шланг.

Aber ★★★★★
()
Ответ на: комментарий от Aber

Э, нет. Цикл по флоатам в векторизированные инструкции точно не переделается. Вот по целым — пожалуйста. А сложение/вычитание/умножение флоатов — не ассоциативная операция, так что увы. Разве что с -ffast-math

А вообще меня больше привлекают такие штуки как blendvps. Избавляет код от кучи ветвлений

deadplace
()

Нет никакой магии, только тупой троттлинг. В худшем случае прироста нет.

anonymous
()

Чего-то кроссплатформенного нет пока что, так как ещё не завезли simd в Стандарт

anonymous
()

Но тут почитал, что AVX, и особенно AVX-512 делают какую-то черную магию с процессорами, при излишнем использовании

никакой черной магии, просто повышенный нагрев от использования

однако в серверных интулях, скорее всего, это не страшно, сильно страдает только десктоп оверклокеров

Ford_Focus ★★★★★
()
Ответ на: комментарий от deadplace

А сложение/вычитание/умножение флоатов — не ассоциативная операция, так что увы. Разве что с -ffast-math

Не знал, век живи — век учись.

Aber ★★★★★
()
Ответ на: комментарий от anonymous

а прироста нет, потому что 256битных FPU нет, со времён бульдозера там 2 блока по 128бит.

Однако, в ZEN2 исправят это досадное упущение

в целом же да, если код пишется не под определённую железку, лучше использовать SSE.

Ford_Focus ★★★★★
()

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

Deleted
()

Почему систему тестируют (при разгоне) с помощью LinX avx? Поэтому, ага.

targitaj ★★★★★
()
Ответ на: комментарий от deadplace

Это слишком низкоуровневая фигня. Сейчас мне приходится для некоторых функций иметь 2 варианта — с SSE-шнягой из этих хедеров и «обычный», где я работаю с массивами. А хотелось бы более кроссплатформенно и высокоуровнево. Чтобы если на машине нет SIMD-инструкций компилялся «обычный» код, если есть — SIMD

У GCC есть vector extension, который поддерживается также и в clang. https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html https://clang.llvm.org/docs/LanguageExtensions.html#vector-literals. Но это не годится т.к. этот vector extension опять-таки работает далеко не на всех платформах, и надо будет мутить какие-то костыли с ифдефами

Интеловский компилятор ICC этого не поддерживает. Интели изобретали какой-то свой особый Intel® Cilk™ Plus https://habr.com/ru/company/intel/blog/204838/, однако из GCC его в итоге выпилили https://www.phoronix.com/scan.php?page=news_item&px=Cilk-Plus-GCC-Dropping

В Clang этот cilk никогда вроде бы и не поддерживался официально, http://cilk.mit.edu/download/ https://cilkplus.github.io/ вот что-то нагуглилось, там патченный LLVM используют.

Про всякие вижуалстудии и прочие проприетарные компиляторы ничего сказать не могу. Стандартного решения вроде как нет

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от SZT

Хотя не, вру. ICC это расширение поддерживает https://godbolt.org/z/g8Ccb7. И тот же GCC может это под всякие ARM компилировать. Но это все завязано на гнутое расширение, так что переносимым это не назовешь.

SZT ★★★★★
()

жми туда, если проц умеет - значит нужно использовать. у интелей на блок с avx отдельные частоты со своим множителем (если я не ошибаюсь). инструкции да, греют камень. но он на то и нужен, чтобы греться и молоть числа.

SevikL ★★★★★
()
Ответ на: комментарий от deadplace

Для Clang надо ext_vector_type а для GCC vector_size. Вот пример: https://stackoverflow.com/a/48538557

Вообще, можно ограничиться атрибутом vector_size - его и Clang и GCC и даже ICC понимает. А вот ext_vector_type понятен только для Clang. Можешь на godbolt потестить.

SZT ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.