Практически любая мат. библиотека поддерживает векторные инструкции. Я, например, использую Eigen + intel mkl для матриц.
Практически любая мат. библиотека поддерживает векторные инструкции. Я, например, использую Eigen + intel mkl для матриц.
Электроника наука слабоизученная (c)
Неизвестный специалист антенного хозяйства по поводу периодического пропадания сигнала в коллективной антенне
Если нужно не одну команду то, как сказали выше, библиотеки с математическими алгоритмами.
Если по одной или близко к этому - то intrinsics (или builtin functions в gcc).
Например:
https://devblogs.microsoft.com/oldne...15-00/?p=97586
Ну это, смотря какие.
Например для одной платформы, я сидел на асме с начала 90-х до начала 00-х - несмотря на наличие компиляторов Си, которые были мягко гоовря, фигня. Очень плохой код генерили. Зато когда в начале 00-х повился первый нормальный Си-компилятор, я с тех по про асм для той платформы забыл, от слова "совсем". Впрочем, в последнее время я и о той платформе почти забыл.
"Замполит, чайку?"(с)"Охота за Красным Октябрем".
"Да мне-то что, меняйтесь!"(с)анек.
<-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.
Эпизод первый, 2005-й год.
Я писал диплом, и нужно было было жёстко оптимизировать мою супер-функцию, чтобы она была быстрее аналогов. Язык - С, процессор - х86, расширения. Попробовал лучшие на тот момент компиляторы (в т. ч. MSVC и Intel), оптимизировал до упора в С, даже циклы пробовал разворачивать. В итоге переписал основной цикл на асме и в результате ускорился почти вдвое (дальше ускоряться уже не требовалось). Тогда компиляторы очень неэффективно использовали доступные регистры.
Эпизод второй. Полгода назад, gcc, cortex m4, оптимизация по использованию ОЗУ.
Тут надо отметить, что gcc вообще генерит менее эффективный код по сравнению, например, с Keil. Заметил явную зависимость эффективности оптимизации от порядка строк в исходнике. То есть когда несколько логически связанных строк кода стоят рядом - компилятор понимает, что они связаны, рассматривает их как целое и неплохо оптимизирует. А если половину этих строк просто перенести вверх строк на 20 - в пределах той же функции и без изменения какой-либо логики, то компилятор, судя по всему, перестаёт видеть между ними логическую связь, и эффективность оптимизации сильно падает.
∇·D = ρ
∇·B = 0
∇xE = – ∂B/∂t
∇xH = j + ∂D/∂t
© J. C. Maxwell, O. Heaviside
Моя последняя оптимизация - ускорение в 10 раз, это была функция умножения в формате double-double.
---------- Сообщение добавлено 12:54 ---------- Предыдущее сообщение было 12:50 ----------
Интрисинки - это скорее коммерческая приблуда и толку от них, по моему мнению, мало.
1) код становится совершенно нечитаемым;
2) мыслить один фиг надо по-ассемблеровски;
3) эффективно управлять памятью и регистрами по-прежнему невозможно.
Насчет нечитаемости трудно согласиться - одна функции соответствует одной ассемблерной инструкция с примерно тем же именем. Но вместо названий регистров можно использовать осмысленные имена переменных.
На мой взгляд, помнить, что и где расположено в 16 регистрах по 256 бит каждый, это сомнительное удовольствие.
А так коммерческая, да. Ведь дает главное: скорость разработки за счет перекладывания работы на компилятор и уменьшение количества ошибок.
Можно оставлять комментарии в коде и помнить не придётся. Таки 21 век на дворе - подсветка кода, всплывающие подсказки и всё такое.
---------- Сообщение добавлено 16:03 ---------- Предыдущее сообщение было 15:51 ----------
Тут вот в чём загвоздка. Одна из ключевых техник оптимизации - это минимизация операций с памятью. А количество регистров ограничено. Можно использовать 10 SSE-интринсиков, и они всё равно будут хранится в памяти - регистров на всех не хватит. Поэтому да - надо знать не просто, что где лежит, а ещё как долго это там лежать будет.
Так я и говорю - скорость разработки. Одно дело когда вы вручную создаете карту регистров, и другое дело когда это сделает компилятор.
Да, вручную вы это сделаете лучше, но в несколько раз дольше. А если вдруг в процессе вкрадется ошибка - то отладка убъет и в сто раз больше времени.
Жизнь слишком коротка, чтобы писать на ассемблере.
Круто, но путанно и непонятно.
Насколько я помню, основной проблемой при асмописании была как раз нехватка (у Интела, по крайней мере) регистров, ставшая фундаментальным эпическим баяном.
Никто не будет размещать долгоживущие данные в регистрах, они не для того, равно как и производитель железа не будет плодить внутри своего процессора регистры специально для данных. Для этого существуют переменные, то есть псевдонимы адресов, с самого первого масма-тасма, так что никаких проблем не было и нет.
Вот пишете вы цифровой фильтр.
Коэффициенты неплохо бы в регистрах держать. Данные для некоторого кол-ва предыдущих отсчетов тоже. Исходные данные в регистр загрузить. Результат опять же. На все это у вас есть 16 регистров (YMM0-YMM15) по 265 (AVX) или 128 (SSE) бит. В них все ваши данные нужно как-то разложить и помнить что и где. Можно самому, а можно компилятору довериться.
Сразу видно не умеющего программировать на асме человека
Не так это делается. Входные/выходные данные вообще не нужно в регистры загружать - их слишком много, и они меняются. Арифметические команды могут работать напрямую с памятью. Да и цифровая фильтрация (IIR) - слишком простая задача, чтобы от её оптимизации можно было что-то выиграть.
Ну я в основном Кейлом и пользуюсь.
Если бы он еще не так медленно все это делал! ИАР по сравнению с ним просто летает.
Нихренассе "мало", иногда без них просто ничего не работает.
Простой пример под тем-же Кейлом - обработчик прерывания, ставим сброс запроса прерывания последней командой в нем - и привет, ниче не работает. Ставим после него nop() - иногда может уже и заработать. Правильно -ставить интрисинком барьер.
"Замполит, чайку?"(с)"Охота за Красным Октябрем".
"Да мне-то что, меняйтесь!"(с)анек.
<-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.
А ещё интрисинки есть не на всё - fpu отсутствует целиком и полностью.
---------- Сообщение добавлено 18:07 ---------- Предыдущее сообщение было 18:05 ----------
Подозреваю, речь не об intel x86)
---------- Сообщение добавлено 18:10 ---------- Предыдущее сообщение было 18:07 ----------
Хотя я тут вспомнил, что тоже как-то использовал SSE-интринсики![]()
"Замполит, чайку?"(с)"Охота за Красным Октябрем".
"Да мне-то что, меняйтесь!"(с)анек.
<-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.
Вот краткий перечень интеловских интрисинков. Легко увидеть, что их тут чуть более, чем дохрена - это бо́льшая часть команд процессора. Так же легко увидеть, что их названия являются калькой с ассемблерных инструкции, только с кучей дополнительных подчёркиваний. Что выполняет функция, например, _mm256_mask_cvtusepi32_storeu_epi16 - сходу понять не получится, один фиг нужно лезть в документацию и вникать. Сначала чтобы написать, потом понять, что ха х-ню написал другой, а потом мучиться с компиляцией на другом компиляторе или платформе.
Смысл программирования на асме прежде в том, что ты совершенно точно знаешь, что он не изменится - что написал, то и будет выполняться. В отличие от компиляторов, которые могут так код оптимизировать, что он после этого работать перестаёт (я с таким даже сам лично сталкивался, только подробностей уже не помню). Пруфы.
Вы совершенно правы. И я выше написал, почему не пишу на ассемблере.
Арифметику сам компилятор Си отлично умеет. Интринсики используются, когда нужно то, что не умеет обычный Си. Например, барьеры памяти и атомарные операции. Или прерывания запретить (на микроконтроллере). Или MMX/SSE/AVX.
Вместо ассемблера сюда можно подставить вообще всё, что угодно - включая просмотр сериалов, чтение книг, пьянство с друзьями, свидания и ухаживания за разными бабами, игра дома на гитаре, танки онлайн, социальные сети, стояние в пробках на автомобиле, сон по 8 часов в сутки, самостоятельное приготовление пищи и так далее. Каждый сам выбирает, на что спускать свою жизнь.
Но когда после оптимизации твоя программа работает в 10-20 раз быстрее, и это видно наглядно, без всяких профайлеров - то испытываешь совершенно непередаваемые ощущения. Это лучше, чем секс![]()
Социальные закладки