All streams
Search
Write a publication
Pull to refresh
65
0
Евгений Красников @jin_x

Разработчик ПО, вокалист, ивентор, хороший человек

Send message

Так, я и не говорю, что это профилировщик. Запятая здесь — это перечисление, а не уточнение.

Есть вариации рекомендаций. Можете глянуть вот это:

В основном всё сводится к связке xor eax,eax + cpuid + rdtsc перед измеряемым кодом и rdtscp + сохранение eax/edx + xor eax,eax + cpuid после. Если процессор поддерживает serialize, думаю, xor+cpuid стоит заменить им.

Ну и ещё можно использовать профилировщики, Intel Architecture Code Analyzer (последняя версия 2019 года).

Intel SDM vol. 2 / RDTSCP:

The RDTSCP instruction is not a serializing instruction, but it does wait until all previous instructions have executed and all previous loads are globally visible.1 But it does not wait for previous stores to be globally visible, and subsequent instructions may begin execution before the read operation is performed. The following items may guide software seeking to order executions of RDTSCP:

• If software requires RDTSCP to be executed only after all previous stores are globally visible, it can execute MFENCE immediately before RDTSCP.

• If software requires RDTSCP to be executed prior to execution of any subsequent instruction (including any memory accesses), it can execute LFENCE immediately after RDTSCP.

See “Changes to Instruction Behavior in VMX Non-Root Operation” in Chapter 26 of the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 3C, for more information about the behavior of this instruction in VMX non-root operation.

Оптимизация Фибоначчи через мемоизацию повеселила, конечно. Когда можно простым циклом обойтись :)

В данном случае да, потому что это операции над целыми числами.

Но если заменить vpaddq, например, на vaddps, то и там, и там будет AVX.

Если нужно выполнить 100 сложений длинных 256-битных чисел, то это операцию из 17 инструкций нужно выполнить только один раз в самом конце. Вот и ускорение.

Если бы у автора был процессор следующего поколения (Broadwell), он бы мог ускорить сложение, используя инструкции ADCX и ADOX, с помощью которых как раз можно распределить 2 сложения. Конечно, на сотне сложений это будет работать медленнее, но на небольшом кол-ве даст больший перфоманс.

А ещё в AVX-512 есть 2 интересные инструкции: VPMADD52LUQ и VPMADD52HUQ, которые выполняют сложение с умножением над 52-битными целыми числами :)

Результат будет неверным, только и всего.

Для него есть полноценная клавиатура: https://youtube.com/shorts/--5n6E6EI08?si=X9LSOPn-jX-8b7Ym

На мой взгляд, он решает следующие проблемы:

  1. Размер. Ноуты 14" и меньше компактные, но работать на них не особо удобно. Здесь же размер 12", который раскладывается в 18". Плюс он очень тонкий.

  2. Если большой экран использовать неудобно (в самолёте, например), можно использовать его как планшет. При этом у обычного планшета экранная клавиатура занимает большую площадь. Здесь же она в нижней горизонтальной половине. Да, есть планшеты и ноутбуки трансформеры, но см. п. 1 :)

В Сферум чат с учителем уже переехал (точнее, изначально там и был создан). А родители между собой общаются где им удобно, кто их может заставить?

Лично мне Viber не нужен, а WhatsApp и подавно. Странно, что второй не забронировали раньше. Удалил бы оба приложения с радостью! В Discord'е есть интересные чаты (негеймерские).

У меня статистика такая: более-менее продвинутые (плюс почти все мои родственники, не без моей помощи) пользуются Telegram. Остальные — Viber (там же родительские, домовые чаты). В WhatsApp обычно какие-то рабочие темы. В Discord в основном молодёжь, геймеры, программисты. Среди основной массы знакомых очень мало тех, кто вообще знает о нём.

Вот здесь описано короче,понятнее и подробнее:

Локальные static-переменные могут быть проинициализированы во время первого обращения, что иногда нежелательно.

Мы общались с автором этой змейки. Моя официальная версия — 64 байта (можно даже поиграть онлайн). Она чуть больше, зато и выглядит посимпатичнее. Но там (в архиве) есть бонусные версии меньшего размера: 56, 48, 46 и 45 байт (последние страшненькие, конечно, но 56 не сильно отличается от 64).

Спасибо! Я правильно понимаю, что прокси используются только для тех задач, в которых стоит галка "Использовать профиль прокси"?

P.S. Ещё в качестве пожелания: не хватает опции "Запускать свёрнутым в трей", чтобы не приходилось при каждой перезагрузке жать на крестик.

Отличная идея! Самому нужна такая прога, а писать было в лом :)

Хорошо бы ещё добавить возможность использования прокси для отслеживания зарубежных сайтов (типа intel.com).

Про алгоритм лучше спросить у автора. Он доступен в Discord (ссылка есть в статье про radar).

Могу сказать только, что после adc al,0x10 на первой итерации int 0x10 выполняет установку 16-цветового EGA видеорежима 640x320, а на следующих выводит точку через функцию ah=0x0C, цвет которой каждый раз меняется c помощью всё той же инструкции adc al,0x10.

Добавлена 45-байтовая версия змейки (в спойлере в конце статьи) :)

Адрес SS:BP+SI указывает на голову змеи. Т.е. по этому адресу лежит "координата" головы (если точнее, то смещение адреса в сегменте DS, соответствующего цвету символа; для простоты я буду называть это координатой). После чтения скан-кода клавиши и преобразования его в смещение координаты (-2 / 2 / -80 / 80) мы добавляем к этому значению координату головы, получая т.о. новую координату. Далее эта координата записывается в SS:BP+SI, сдвигая всё остальное далее по массиву.

Например, длина (CX) = 5. В массиве (по адресу SS:BP+SI) были такие слова: [11] [13] [15] [17] [19] (на самом деле прямо таких значений не будет, но для простоты пусть будет так, можете мысленно прибавить к этим числам 64000). Мы нажали вниз (80), получили новую координату: 80+11=91, новый массив будет таким: [91] [11] [13] [15] [17].

При этом мы рисуем только голову (91) и затираем хвост (19). При съедании яблока после вышеуказанной процедуры длина увеличивается на 2, и на следующем кадре будет так: [171] [91] [11] [13] [15] [17] [мусор]. В этот раз мы затираем (один раз) "мусорную" координату. В теории, это может быть координата на экране, т.е. мы можем затереть какое-то яблоко, часть себя или даже нарисовать на экране более жирную точку, если координата окажется чётной (символ с кодом 7, т.к. мы затираем хвост цветом 7). Если присмотреться к скриншоту, то можно увидеть, что внизу есть более жирная точка. Этот артефакт — как раз результат такого "удаления" несуществующего хвоста с мусорной координатой, которая оказалась чётной и попала в экран.

Этот глюк можно убрать, добавив инструкцию mov [bp+si],cx после loop, но это +2 байта (хотя можно всё равно уложиться в 64 байта, убрав звуковой щелчок out $61,al). Но тут всё равно нет 100% гарантии, что первые 5 (начальная длина змейки) координат не попадут в экран (а эти координаты исходно мусорные). Нужно добавлять ещё несколько байт в начало кода для их очистки. Но и в этом случае можно уложиться в 64 байта, если прибавлять длину змейки на 1, т.к. мусорной координаты при увеличении длины не будет, и mov [bp+si],cx здесь уже будет не нужен + кол-во inc cx уменьшится на 1 шт + можно до кучи убрать удаление курсора.

P. S. Обычно сдвиг массива "вперёд" делается с конца назад (чтобы не затереть самого себя), но используя xchg можно делать это, двигаясь с начала вперёд (как здесь).

Нет, меня там не было ?‍♂

KolibriOS — тоже магия ассемблерного искусства.

На SSE/AVX даже синус так просто не вычислишь (особенно в упакованном формате) :)

Information

Rating
Does not participate
Location
Самарская обл., Россия
Date of birth
Registered
Activity

Specialization

Software Developer, Backend Developer