2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Еще раз о пользе от ассемблера
Сообщение21.01.2024, 20:57 
Заслуженный участник


20/08/14
11776
Россия, Москва
A_I в сообщении #1626738 писал(а):
Другое дело - разработчики самих контроллеров и драйверов, - тут возможно ещё долго останется низкоуровневое программирование. Но таких специалистов много и не надо.
Низкоуровневое программирование не означает прям непременно на ассемблере. Тот же С вполне справляется. Да и некоторые другие ЯВУ. Добавить при необходимости средства работы с физическими адресами, с битами, прерывания, исключения, разные типы/классы памяти (собственно что и сделано в компиляторах под любой МК) - и вперёд. И пока скорость такой работы устраивает - нет проблем. Пишут же под МК и на бейсике, и на паскале, и на питоне (или руби?), и ещё много на чём и ничего, работает, в том числе и весьма низкоуровневые вещи. ИМХО Вы по прежнему упираетесь не в тот критерий необходимости асма.
Вы знали что не под все архитектуры есть трансляторы ассемблера? Бывает только С и выше, ничего более низкого. Ну или массив кодов конечно можно в .c запихнуть если осциллографом восстановите коды команд (потому что документации тоже разумеется нет). ;-) Один из известных примеров - GPU. Раньше асм был и доки по командам были, но уже с десятилетие как отрезало. CUDA, OpenCL, OpenGL, что там ещё, а асма под новые видюхи нет. Разумеется это забота о юзерах и/или об акционерах (сколько труда по написанию публичных док оплачивать), как же иначе.

А специалистов таких да, много не надо, никто и не спорит. Уже лет 40 как. Споры же до сих пор вспыхивают. ;-)

 Профиль  
                  
 
 Re: Еще раз о пользе от ассемблера
Сообщение21.01.2024, 21:00 
Аватара пользователя


11/12/16
13850
уездный город Н
Это смутно мне напоминает
Индо-пакистанский инцидент
историю из середины 90-х годов.

Выпускник мехмата устраивается в контору, которая делает спутники, и получает первое задание: написать программку, которая читает датчик, и в зависимости от показаний выдает команду на исполнительный механизм.
Делов-то. "Три часа на фоксе". Вечером новый работник приносит программу на C.
Руководитель говорит "Хорошо. А теперь у тебя восемь байт памяти на переменные, 20 байт на код (конкретные цифры, понятно, за давностью лет не помню) и требования на время реакции".
И ушел инженер учить асм.

 Профиль  
                  
 
 Re: Еще раз о пользе от ассемблера
Сообщение21.01.2024, 21:39 
Заслуженный участник


20/08/14
11776
Россия, Москва
Ну да.
Хотя космос дело такое, не все к нему допущены, хотя сейчас и полегче (за бугром).
А вот МК - ширпотреб, суют везде. И очень нередко давятся ценой до рублей (даже при тысячных тиражах, про миллионы не будем). Вот такие жлобские заказчики. И поневоле не то что асм, Форт вспомнишь с его косвенным кодированием. А если ещё и от мелкой батарейки питается и должно жить подольше пары часов ... Да, ниша не сказать чтобы широкая (хотя разнообразная), но уж поширше космоса.

 Профиль  
                  
 
 Re: Еще раз о пользе от ассемблера
Сообщение21.01.2024, 21:53 


01/09/14
500
Dmitriy40 в сообщении #1626707 писал(а):
Но когда я вижу (да и пишу) код на том же С для замены команды rcl/rcr (сдвиг через перенос) - у меня волосы дыбом. Адекватной замены командам adc/sbb/mul/div (c xDX) в языках семейства C тоже нет - а это базовые операции с длинной арифметикой! popcnt, bsf/bsr, pdep/pext - да полно команд, на С выглядящих как куча непонятного кода, а уж во что превращающихся в машинном коде ... лучше и не знать, спать спокойнее.

А можете дать пример проблемного кода на Си?

 Профиль  
                  
 
 Re: Еще раз о пользе от ассемблера
Сообщение21.01.2024, 23:07 
Заслуженный участник


20/08/14
11776
Россия, Москва
Не уверен что вспомню где видел, сам к счастью не писал.
Про замену popcnt на 5 сдвигов и 5 and и 5 сложений (вычитаний) много где описано, в коде ещё 5 mov будут (все сдвиги одноадресные), порядка 20 команд. Не так страшно, что написали, примерно то и скомпилилось.

Сам попал лишь на комбинацию
Используется синтаксис ASM
        mov     EDX,1
.l:     ;тут код вычисления следующего бита в C
        rcl     EDX,1
        jnc     .l
Очень удобный цикл вычисления (или получения откуда-то) битов, не нужен лишний регистр под счётчик.
На С мало того что нет бита C, так ещё и последние две команды ну никак совместно не реализуются. Сдвинуть можно, бит всунуть в младший можно, перейти по старшему можно, а вот сначала всунуть, а потом перейти - вах. Только лишняя переменная, или для счётчика циклов, или для старшего бита. На компе пофиг, в МК - когда как, бывает и жалко.

adc/sbb, ну вот как их на С закодировать? Единственный более-менее приемлемый способ без ввода расширенных типов данных - сравнивать результат сложения с операндом и если меньше, то писать в отдельную переменную перенос: z=a+b+c; if(z<a || (c && z==a)) c=1; else c=0; (надеюсь не наврал, из головы же) - представляете во что это выльется в коде?

Как закодировать на C команду mul и тем более div с 128-битным результатом (аргументом) я даже думать не буду, не знаю. Все делают inline asm и не парятся.

pdep/pext вообще попадаем на цикл с 4 переменными (счётчик, результат, исходное число, маска) с условным переходом в нём и парой сдвигов (один условно). Даже не буду С код писать, и так понятно что команд 8-10 в асме и 32 итерации, мрак.

-- 21.01.2024, 23:39 --

Кстати, вот выше в офтопе был выложен длиннющий код на C с функцией ValidateAuxData, проверяющей какие-то 64шт 16-битных полей. А при наличии AVX грузим всю структуру в 4 регистра, константу в 5-й регистр (а можно и в памяти оставить, на скорость не влияет), сравниваем командой vpcmpeqw, вываливаем старшие биты в РОН (vpmovmskb), там делаем and и если вдруг, то return. Без циклов. Фактически получается развёрнутый цикл на 4 итерации, но всё уложится команд в 20-25, причём времени займёт я бы так сказал тактов 12 в худшем случае. На 64 сравнения 16-битных полей! По 0.2 такта на поле. Скомпилите кто желает ту тучу циклов и посмотрите сколько будет и команд, и времени на них (тоже в худшем случае). Что будет короче или не сильно длиннее поверю, все циклы простые, что быстрее - нет, 0.2 такта на поле без векторизации никак не получить. А теперь вопрос: ну и какой компилятор додумается до такой векториазции?! Ну-ну. Можно и без AVX, грузить по 4 поля в регистр, xor, иногда and, jz, итого 3.3*16=53 с небольшим команд, думаю хватит тоже тактов 12. Додумается компилятор С до такого? Сомневаюсь.
Разумеется это полностью надуманный пример: товарища скорость С вполне устраивает и париться нет причин. Я и не предлагаю. Просто реальный пример "умности" компиляторов.

 Профиль  
                  
 
 Re: Еще раз о пользе от ассемблера
Сообщение22.01.2024, 06:26 


18/11/18
590
Dmitriy40 в сообщении #1626762 писал(а):
Все делают inline asm и не парятся.


Вообще-то смешивание с помощью вставок никогда не было хорошей практикой - мух от котлет всё же лучше отдельно подавать.
На примере той же ранее упомянутой тепловизорной матрицы - Мелексис сделали матрицу. Китайцы на её основе (добавив корпус, оптику, простенький контроллер и еепром) создали "полуфабрикат" тепловизора, и на этом этапе абсолютно оправдано низкоуровневое программирование:
Изображение
А дальше - общение на уровне интерфейса (в данном случае i2c).
Как говорится, зачем мне мучаться и общаться жестами, когда есть нормальная "человеческая" речь? :lol:

 Профиль  
                  
 
 Re: Еще раз о пользе от ассемблера
Сообщение22.01.2024, 13:24 
Заслуженный участник


20/08/14
11776
Россия, Москва
Видеопоток через I2C?! :facepalm:
Не знаю (да и не хочу) как здесь, но обычно скорость I2C не превышает 400КГц, при 16Гц кадровой это максимум 52х52 пикселя по 8 бит каждый. Даже для предельных для I2C 1МГц и 64Гц кадровой это максимум 41х41 пиксель. :facepalm: Или там без градаций яркости?! Тогда 150х150 или 120х120, уже хоть что-то, но без полутонов ...

A_I в сообщении #1626776 писал(а):
и на этом этапе абсолютно оправдано низкоуровневое программирование:
Но асм тут не нужен, даже 1Мбит/с любой комп легко примет и на С даже полностью программно. Вот успеет ли подёргать биты с точностью порядка 100нс - вопрос, как именно организован вывод-вывод, т.е. ограничение вовсе не от С берётся, а от скорости доступа и реакции аппаратного ввода-вывода.
Низкоуровневое - да, разумеется. Асм - совсем не обязательно. Повторю, это не синонимы. Низкоуровневые вещи можно и на бейсике писать и почти на чём угодно.

 Профиль  
                  
 
 Re: Еще раз о пользе от ассемблера
Сообщение22.01.2024, 13:46 
Аватара пользователя


11/12/16
13850
уездный город Н
Dmitriy40
FGJ про I2C.
Цитата:
В стандарте версии 2.0 (1998 год) представлены высокоскоростной режим работы 3,4 Мбит/с (High-speed mode, Hs) и требования пониженного энергопотребления. Незначительно доработан в версии 2.1 (2000 год).

В версии 3 (2007 год) добавлен режим 1 Мбит/с (Fast-mode plus, Fm+) и механизм идентификации устройств (ID).

В версии 4 (2012 год) появился однонаправленный режим 5 Мбит/с (Ultra Fast-mode, UFm) с использованием двухтактной логики без подтягивающих резисторов, добавлена таблица предустановленных идентификаторов.

 Профиль  
                  
 
 Re: Еще раз о пользе от ассемблера
Сообщение22.01.2024, 14:30 
Заслуженный участник


20/08/14
11776
Россия, Москва
Спасибо, про 5Мбит/с (и про 10Кбит/с) не знал.
Но, добавлены то они добавлены, а вот аппаратно поддерживаются очень редко. Даже 1Мбит/с нечасто увидишь. Хотя многие всё же работают на частотах выше документированной, но что там с гарантированными интервалами (а они меняются от скорости к скорости даже в процентах! так что простое задирание частоты не поможет) я не смотрел.

-- 22.01.2024, 14:45 --

А, посмотрел по названию, там жалкие 32х24 точки. Тогда 400КГц I2C почти хватает на 64Гц кадровой. А, они и 1Мбит/с поддерживают, только не понял как стандарт или как разгон 400Кбит/с.
Здесь вообще на питоне пишут и ничего, работает. Правда как там реализован I2C смотреть не стал (не люблю библиотеки adafruit, насмотрелся на ихние либы для tft дисплеев, бррр).

 Профиль  
                  
 
 Re: Еще раз о пользе от ассемблера
Сообщение22.01.2024, 19:10 


18/11/18
590
Dmitriy40 в сообщении #1626802 писал(а):
Спасибо, про 5Мбит/с не знал.

(Оффтоп)

А что, так можно было ?.. :facepalm:
(утверждать одно на голубом глазу, а потом "изящно" переобуться) :-)

Про "жалкие" точки тоже не понял - кому и за что их жалко?
Вообще, излишняя эмоциональность при обсуждении технических вопросов как-то нелепо выглядит.. 8-)

 Профиль  
                  
 
 Re: Еще раз о пользе от ассемблера
Сообщение21.11.2024, 10:24 
Аватара пользователя


07/02/12
1434
Питер
Dmitriy40 в сообщении #1626707 писал(а):
Адекватной замены командам adc/sbb/mul/div (c xDX) в языках семейства C тоже нет - а это базовые операции с длинной арифметикой! popcnt, bsf/bsr, pdep/pext - да полно команд, на С выглядящих как куча непонятного кода, а уж во что превращающихся в машинном коде ... лучше и не знать, спать спокойнее

А как вы относитесь к использованию Intrinsic-функций в Си?

 Профиль  
                  
 
 Re: Еще раз о пользе от ассемблера
Сообщение21.11.2024, 17:08 
Заслуженный участник


20/08/14
11776
Россия, Москва
bondkim137 в сообщении #1662238 писал(а):
А как вы относитесь к использованию Intrinsic-функций в Си?
Положительно. Это почти асм, только без заморочек с регистрами. Есть лишь пара но:
1. Это вот "почти" может несколько загубить скорость выполнения, из-за лишних пересылок (да, я не верю что компиляторы настолько хорошо оптимизируют код).
2. Не всё можно сделать макросами (а это фактически они), скажем вернуть два регистра (после div RCX) они вроде не могут (возврат результата в параметрах по ссылке - извращение). Как не могут и перенос учесть и вернуть, привёл же пример выше.
3. Есть ли интринсики для команд cmov? А это ведь сокращение условных переходов, основной беды высокой скорости.
4. А ещё я нередко пользуюсь тем что lea не меняет флаги и пишу код типа sub, lea, cmovc (или jc) - такие интринсики тоже есть?!
Так что вещь хорошая, но полностью асм в вычислительных задачах не заменяет. Хотя если только про SSE/AVX, для чего они и были придуманы, то да, удобно.

 Профиль  
                  
 
 Re: Еще раз о пользе от ассемблера
Сообщение22.11.2024, 02:18 
Аватара пользователя


07/02/12
1434
Питер
Dmitriy40, глубоко не вник, но навскидку:
- условное присвоение cmov и без интринсиков используется C-компиляторами
- деление и остаток от деления тоже
- lea компиляторы тоже давно используют в полную силу, безотносительно интринсиков

С флагом переноса у вас пример эффектный, но довольно узкоспециализированный. И сходу не могу пока однозначно сказать, что компилятор до такого однозначно не додумается, надо потыкать.

Но это все - лирика. А то, что меня недавно в рабочем смысле заинтересовало - это как попросить компилятор гарантированно сделать
Код:
dec dword [rbx]

вместо
Код:
mov eax, [rbx]
dec eax
mov [rbx], eax

При использовании из C в 64-битном коде под Windows. Inline, без вызова внешней подпрограммы, скомпилированной сторонним yasm, например.

 Профиль  
                  
 
 Re: Еще раз о пользе от ассемблера
Сообщение22.11.2024, 16:05 
Заслуженный участник


20/08/14
11776
Россия, Москва
bondkim137 в сообщении #1662298 писал(а):
условное присвоение cmov и без интринсиков используется C-компиляторами
А может и не использоваться и остаться условный переход, Вы этим не рулите, как компилятору вздумается так и сделает. А ещё вот буквально на днях написал код, в котором две подряд разных (с разными не противоположными условиями) cmov (тройной выбор) и потом сразу же условный переход, потому что так удобнее. Уверены что компилятор такое удумает? Ну-ну.
bondkim137 в сообщении #1662298 писал(а):
деление и остаток от деления тоже
Одновременно? Сомневаюсь. Впрочем, могут, наверное. Но вот будут ли использовать - вопрос! И как это записать в С коде понятно компилятору (чтобы таки использовал) - тоже вопрос. Мне малоинтересный, я предпочитаю асм везде где требуется скорость.
bondkim137 в сообщении #1662298 писал(а):
lea компиляторы тоже давно используют в полную силу, безотносительно интринсиков
Между командой сравнения и условным переходом (или cmov) по ней? Сомневаюсь. Я использовал для получения конструкции (a-b) mod p при условии что и a и b меньше p, тогда достаточно их вычесть, добавить p в другом регистре без изменения флагов (и lea тут экономит и mov и главное не трогает флаги) и сделать cmovc от результата вычитания.

bondkim137 в сообщении #1662298 писал(а):
как попросить компилятор гарантированно сделать
Я не знаю.
И собственно зачем? Таких конструкций что, много в коде (скажем хотя бы треть команд), в нагруженном месте? Иначе оно не медленнее dec (порты чтения часто достаточно свободны, записи простаивает реже, но тоже весьма часто). Или код не лезет в L1 или внутренний цикл в L0 (uop cache) или ROB с шедулером? Тогда да, код лучше сократить.
Отдельно умиляет когда такие конструкции повторяются для одной и той же переменной, т.е. сохранили в память, потом следующей же командой снова оттуда читаем для следующей операции. :facepalm: И не для volatile переменных, где это необходимо. У меня Delphi5 любит такие штуки, я как гляну в код, волосы дыбом. И всё что требует скорости пишу на асм (инлайн или внешнем).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group