Хардкорная оптимизация для достижения верхнего процентиля
GHub Platform · Гайд · 0 ответов · 5 просмотров

Игра предлагает 3 метрики: Количество циклов. Самая сложная метрика, иногда требующая большого творчества и воображения для ее оптимизации. Значение: количество тиков времени от начала до выполнения всех условий задачи. В каждом цикле все ваши EXA обычно выполняют 1 строку кода, однако некоторые операции могут быть заблокированы на некоторое время и занимать больше времени. Кроме того, запись в регистр M занимает 2 тика, а песудо-инструкция MARK не использует цикл. Если у вас есть 10 EXA, работающих параллельно, они могут выполнить 10 инструкций за один цикл. При выполнении каждого условия (обычно это заканчивается смертью последнего EXA) игра засчитывает потраченные циклы. Также игра запускает 100 тестов и учитывает количество самых больших циклов. Условия могут быть следующими: создать файл с определенным содержимым удалить конкретный файл изменить или переместить файлы, не оставляя следов, что означает, что все EXA уничтожены; передать последовательность сигналов в аппаратный регистр размера. Количество строк кода, включая MARK. Макрокоманда @REP N сама по себе не учитывается, но N сгенерированных блоков кода будут учитываться в метриках. Активность. Самые простые метрики для оптимизации. Просто подсчитывает количество вызовов LINK. Теория относительности здесь легко достигает верхнего процентиля. REPL — ваш друг. Представьте себе 3 последовательных узла: 801, 802, 803, один EXA работает в 802, другой в 803. Тривиальный подход: EXA A LINK 800 LINK 801 ПРИМЕЧАНИЕ СДЕЛАЙТЕ НЕКОТОРУЮ РАБОТУ EXA B LINK 800 LINK 801 LINK 802 ПРИМЕЧАНИЕ СДЕЛАЙТЕ НЕКОТОРУЮ РАБОТУ У нас есть 5 вызовов LINK, что означает активность = 5. Просто замените его на: LINK 800 ССЫЛКА 801 REPL ВТОРОЕ ПРИМЕЧАНИЕ СДЕЛАЙТЕ НЕКОТОРЫЕ EXA A WORK HALT MARK SECOND ПРИМЕЧАНИЕ СДЕЛАЙТЕ НЕКОТОРЫЕ EXA B WORK Теперь второй EXA создается в узле 801 вместо вашего хоста, и ему не нужно делать дополнительные 2 движения. Теперь активность = 3. Размер — более интересный показатель с точки зрения оптимизации. Иногда это также коррелирует с количеством циклов, но не всегда. Кстати, пустые строки не считаются, используйте это для удобства чтения! Давайте обсудим некоторые техники. Объедините арифметические операции с чтением/записью. Предположим, что вашему коду требуется изменить начальное значение. COPY F T MULI T 2 T COPY TM может быть преобразовано в MULI F 2 M. Это также уменьшает количество циклов. Не используйте DROP и HALT везде. Когда строк кода больше нет, EXA удаляет файл и автоматически останавливается. Пример: LINK 800 GRAB 200 LINK 800 DROP HALT из журнала равен LINK 800 GRAB 200 LINK 800 Используйте DROP только тогда, когда вам нужно переместить EXA куда-то еще без этого файла или когда вам нужно захватить второй файл GRAB 300 COPY F X DROP LINK 800 Используйте HALT только тогда, когда у вас есть ветки условий или реплицированные exas и второй ветка может выполняться без исключений (обработка исключений описана в следующем параграфе). Пример: получить переменную из радио и поместить положительный модуль в файл: COPY M X TEST X > 0 FJMP NEGATIVE COPY X F HALT MARK NEGATIVE MULI X -1 F Здесь без HALT будут выполнены обе ветви. Исключения — ваши друзья! Когда возникает ошибка времени выполнения: нет такой ссылки/файла/аппаратного обеспечения, захват второго файла без отбрасывания первого чтения с конца деления файла на ноль EXA уничтожается. Давайте воспользуемся этим. Чтение из файла: GRAB 200 MARK LOOP COPY FM TEST EOF FJMP LOOP Попытка прочитать файл по адресу EOF вызывает исключение и EXA останавливается: GRAB 200 MARK LOOP COPY F M JUMP LOOP Новый фрагмент кода делает то же самое. Также это значительно уменьшает количество циклов. Захват файла без его удаления: REPL A GRAB 200 MARK A GRAB 201 Если сначала EXA не удаляет файл 200, он выполнит задание, затем достигнет отметки A и произойдет сбой из-за исключения доступа Нет файла/ссылки/оборудования REPL A LINK 801 ПРИМЕЧАНИЕ НЕКОТОРЫЕ РАБОТЫ MARK A GRAB 200 или ПРИМЕЧАНИЕ НЕКОТОРОЕ УСЛОВИЕ TJMP A LINK 801 ПРИМЕЧАНИЕ НЕКОТОРЫЕ WORK MARK A LINK 802 ПРИМЕЧАНИЕ НЕКОТОРАЯ РАБОТА В этих фрагментах маловероятно, что узел 801 имеет ссылку на 802 или файл 200, поэтому EXA выйдет из строя после достижения отметки A. Однако для замены узлов может потребоваться HALT: REPL A ПРИМЕЧАНИЕ НЕКОТОРАЯ РАБОТА HALT MARK A LINK 801 ПРИМЕЧАНИЕ НЕКОТОРАЯ РАБОТА После достижения отметки A EXA может перейти к 801 и все испортить. Поэтому обратите внимание, какую часть кода использовать в ветке условий или REPL. Замените условия на арифметические ограничения. Когда значение превышает 9999 или -9999, оно фиксируется. Мы можем использовать его MARK L1 COPY #NERV X TEST X > 50 TJMP H TEST X < -120 TJMP L COPY X M JUMP L1 MARK L COPY -120 M JUMP L1 MARK H COPY 50 M JUMP L1 можно эффективно заменить на ADDI 9949 #NERV X SUBI X 9949 X SUBI X 9879 X ADDI X 9879 M, что значительно уменьшает размер и количество циклов. Сохраните движения с помощью REPL. структура узла такая: 1=>1=>1=>1 Итак, 2 EXAs ССЫЛКА 1 ССЫЛКА 1 ССЫЛКА 1 ПРИМЕЧАНИЕ РАБОТА 1 ССЫЛКА 1 ССЫЛКА 1 ССЫЛКА 1 ССЫЛКА 1 ПРИМЕЧАНИЕ РАБОТА 2 можно заменить на: ССЫЛКА 1 ССЫЛКА 1 ССЫЛКА 1 REPL A ССЫЛКА 1 ПРИМЕЧАНИЕ РАБОТА 2 ОТМЕТИТЬ ПРИМЕЧАНИЕ РАБОТА 1 сохранение 1 строки кода с правильным трюком с исключением. Попробуйте использовать необработанное значение T вместо дополнительной тестовой инструкции. Предположим, нам нужно прерваться, когда получим 0 COPY M X TEST X = 0 TJMP END ПРИМЕЧАНИЕ SOME WORK HALT MARK END HALT Равно этому фрагменту COPY M T FJMP END ПРИМЕЧАНИЕ SOME WORK MARK END Причина: когда T равно 0, FJMP работает. Когда T имеет другое значение (включая отрицательные значения, например -1), TJMP работает. Инструкция TEST заменяет T на 0 или 1. Примечание. HALT удален, поскольку, если метка находится в последней строке, HALT будет автоматическим. Также для значения, отличного от 0, код достигнет отметки END, но ничего не сделает, поэтому HALT можно опустить. Это также уменьшает количество циклов, особенно в циклах. Самая интересная часть. Основная цель здесь — уменьшить количество операций в циклах, что экономит много тактов. Однако есть и некоторые хитрости, позволяющие сэкономить пару циклов здесь и там. Прежде всего, внимательно прочитайте предыдущую главу, поскольку оптимизация размера LoC также часто помогает уменьшить количество циклов. Давайте теперь обсудим оптимизацию циклов. По возможности используйте макросы @REP. Это работает только тогда, когда вы точно знаете, сколько циклов требуется. Отправить5 записей из файла GRAB 300 @REP 5 COPY F M @END Записать 0,1,2..10 MAKE @REP 10 COPY @{0, 1} F @END Travel 800=>801=>802=>803=>804 @REP 5 LINK @{800, 1} @END Записать 10, 8, 6 , 4, 2, 0 MAKE @REP 5 COPY @{10, -2} F @END Однако при запуске программы @REP N будет заменено строками кода размером N x блоков. Также вы не можете использовать вложенный @REP. Каждая программа имеет лимит LoC. Если @REP добавит слишком много кода, ваше решение не сможет сравниться с таблицей лидеров. Это решение превосходит верхний процентиль по количеству циклов: но его невозможно посчитать, поскольку после запуска имеется 110 LoC, а допустимый размер — 50 LoC. Однако вам придется заменить меньшие циклы, у которых есть известные ограничения, на @REP, чтобы улучшить показатели количества циклов. Используйте значение регистра T вместо TEST, когда это возможно. Запишите в файл N,N-1..1,0 (N из другого EXA): ADDI M 1 T MARK LOOP SUBI T 1 T COPY T F TJMP LOOP Честно говоря, это не самое оптимальное решение, его можно оптимизировать еще на 1 цикл :D COPY M T MARK LOOP COPY T F SUBI T 1 T TJMP LOOP COPY 0 F Итак этот цикл потребляет 3 цикла на элемент. Цикл с TEST займет 4 цикла. Поменяйте циклы, чтобы продолжать использовать T вместо TEST. Запишите в файл 0, 1 .. N (N из другого EXA): MAKE ADDI M 1 T SUBI T 1 X MARK LOOP SUBI T 1 T SUBI X T F TJMP LOOP Еще 3 цикла на элемент. Используйте EXA как процедуру (подпрограмму)! Предположим, у вас есть несколько независимых задач для вашего EXA, которые используют одни и те же исходны
ИсточникGHub Platform · автор02.08.2026, 18:40:36
Игра предлагает 3 метрики: Количество циклов. Самая сложная метрика, иногда требующая большого творчества и воображения для ее оптимизации. Значение: количество тиков времени от начала до выполнения всех условий задачи. В каждом цикле все ваши EXA обычно выполняют 1 строку кода,…
Войдите, чтобы писать в группе