Архитектура ARM vs x86 что лучше?

Тема в разделе "WASM.ASSEMBLER", создана пользователем Intro, 25 янв 2020.

?

Круче?

  1. ARM

    6 голосов
    31,6%
  2. x86

    10 голосов
    52,6%
  3. Другие архитектуры.

    3 голосов
    15,8%
  1. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    579
    А реально, если у нас кэш данных и кода, то загружать данные из кода не слишком эффективно. Самый реальный вариант это.
    mov r0, [r8+shift] ;в место r8 может ещё какой-то регистр
    В общем, выделять регистр на таблицу с константами, и ещё shift индексируется сразу двордами или квордами, ну в общем: r0:=[r8+sizeof(r0)*shift]
     
  2. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    456
    Это как посмотреть и как устроено. Если данные для инструкций разбросаны между кодом сравнительно недалеко от кода потому что адресация относительно ip (эта идиома проникла и в x86-64 где теперь тоже адресация по умолчанию - это смещение от rip, помогает писать relocatable код и изначально была основным приёмом, как понятно, в ARM (и многих других RISC)), то происходит наоборот замусоривание кеша данных строками содержащими еще и код который в данных точно не нужен и наоборот. Поэтому я решил вспомнить детали и погуглил: https://devblogs.microsoft.com/oldnewthing/20220808-00/?p=106953
    И выяснил, что в ARM32 это реально была проблема, т.к. offset для ip-адресации был [math]\pm 4[/math]Кб, т.е. даже в небольшой программе мы начинаем впухать в эту проблему даже находясь внутри одного модуля компиляции.
    Однако в ARM64 offset для ip-адресации уже [math]\pm 1[/math]Мб и на практике любой модуль компиляции скорее всего сможет для своих констант содержать выделенный сегмент с константами. Всё-таки ARM64 это реально работа над кучей мелких ошибок.
    Ну и по возможности всё-таки надо грузить константы прямо из кода - для 32-битных констант живее всех живых идиома в две инструкции с 16-битным immediate делать load-low/load-high, плюс выверты с тем, что можно 16-битный immediate сразу поместить в любой WORD 64-битного РОН с сохранением, обнулением или инверсией остальных бит. Как то так стало в 64 бита, т.е. 64-битные константы не через ip-адресацию грузить всё-таки накладно, в отличие от 32-битных или таких которые по стечению обстоятельств попадают под оптимизацию.

    Вот чем ip-адресация прикольна, что константы текущего модуля при релокации перемещаются в памяти вместе с ним и если можно через неё дотянуться, то не нужно уже иметь ввиду, что в программе может быть сотни/тысячи модулей. Поэтому rip-адресация в x86-64 сейчас доминирует - и это не изобретение Intel, а наоборот, скорее ARM/RISC.
    В регистре можно хранить конечно некий "контекст", но вот контекст чего и что с ним делать при переходе в DLL? Это уже пахнет изменением ABI.
     
  3. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    579
    Если ARM может не исполнять(условные) команды, то тут можно попробовать хакнуть систему. Я говорил что проблему загрузки констант можно было решить, если бы сами инструкции могли быть 1 и 2х словными.
    Делаем так, устанавливаем флаги, точней один флаг так, чтобы следующая инструкция не выполнилась 100% и её читаем как константу, конечно у нас получиться 31 + ещё один бит = 1, но его можно вырезать.
    Так что хороший RISC это необязательно чисто инструкции равные одному слову, можно сделать и два, тем более если архитектура позволяет делать инструкции условными.
     
  4. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    456
    Имхо идея immediate которые кратны слову команды RISC-у не повредят. Нужно только сделать крайне простым определение сколько immediate-ов находится за командой и я думаю всё быстро и без пороков будет работать.
    И наверное тогда то и можно будет реализовать вменяемую кодировку на 16 битном слове команды - потому что настоящий RISC начался только с 32-битных команд куда уже могли влезать вменяемые offset-ы.
     
  5. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    579
    Последнее редактирование: 12 ноя 2023
  6. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    456
  7. R81...

    R81... Active Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    144
  8. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    579
    Известно что CISK лучше RISC тем, что хорошо экономит память, а она была очень дорогая, тот же альтаир в самом первом варианте имел аж 256 байт, как какой-то калькулятор. Хотя RISC проще и быстрей, но нормально это архитектура смогла развернуться только в конце 80-х, хотя в середине 80-х уже память подешевела, именно тогда и сделали ARM, но как понятно пока экспериментальный образец(память пока дороговата), в ПК уже можно было пихать сотни КБ, а потом и МБ, но это уже самое начало 90-х. Но интел в 1989 создал 486 скалярный проц с одним конвейером, инструкции преобразовались RISC-подобные внутренние команды, в результате многие простые инструкции выполнялись за один такт, прям как RISC. Так что это остановила продвижения RISC т.е. ARM, разница по быстродействию +/- равна, ну и наследие, все уже подсели на х86.
     
  9. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    456
    Да, сейчас произошла своего рода унификация и что интели, что армы слились в одном подходе, когда самые навороченные их варианты это out-of-order на микрокоде и по сути концептуально это одно и то же.
    Но риску всё-равно в этих условиях существовать проще - с ним проще декодер, проще делать процессоры без out-of-order (а в мобилках они сплошь и рядом) и т.п.
    --- Сообщение объединено, 13 ноя 2023 ---
    P.S.
    Да и даже взять момент перехода на 64 бита - интели/амд всячески реюзали всё тот же instruction set обвешивая его префиксами и до сих пор с этими префиксами бегают. ARM с переходом на 64 бита просто заново переосмыслил всю систему команд, сделал её с нуля - общие лекалы те же, но даже о малейшей совместимости речи не идёт. Арифметика теперь тотально трёхоперандная (то, что интели запоздало привносят последними еще не вошедшими в широкую практику префиксами), сложные микрокодные сохранения любых регистров по маске уступили место load/store pair, когда только пара регистров может быть в одной инструкции на последовательное чтение/запись памяти, оффсет от ip значительно увеличен, никакого Thumb нет и не планируется и т.п. и т.д., всё перепахано с нуля. 32-битный режим совместимости просто по другому декодирует вообще команды. Могут себе позволить - здесь декодер не напоминает разбухшую печень алкоголика.
    --- Сообщение объединено, 13 ноя 2023 ---
    P.P.S.
    Кстати на ARM64 еще переосмыслили блочные инструкции - копирование кусков памяти одной инструкцией там в топовых моделях есть, но только не одной инструкцией, а тремя. Типа начало блочного копирования - одна инструкция, тело блочного копирования - вторая инструкция и конец блочного копирования - третья инструкция. В чём прикол? Я думаю в выровненности адресов по линейкам памяти - это же первая задача которую решают всякие fast memory copy via SSE в коде - большие блоки пробрасываем максимально возможными выровненными блоками доступа к памяти. То есть да - для упрощения микрокода ARM сделали вот так и вероятно оно будет промышленным стандартом который потом интели потянут в свои новые префиксы. :lol: