Show HN: XR2000: A science fiction programming challenge
XR2000 — новый программистский квест в жанре научной фантастики.
Он объединяет бинарные протоколы, криптографию и развёрнутый сюжет, который пока охватывает лишь первую главу. Дальнейшее зависит от интереса участников.
Вдохновение дали:
- TIS-100 — псевдоассемблер в игровой форме.
- Space Traders — космическая торговля через REST API.
- Protohackers — челленджи по сетевым протоколам.
Старт:
nc clearsky.dev 29438
Приятного погружения!
Комментарии (14)
- Участники делятся ссылкой на похожий Sci-Fi-контест 2006 года, где нужно писать собственную VM.
- Появился новый TCP-пазл на clearsky.dev:29438; при подключении требуется отправить 0-байт + «XR2K» для документации.
- Сервер перегружен HN, поэтому текст иногда не выводится или после команды ничего не происходит.
- Некоторые пробуют использовать LLM для упрощения игры.
- Один из игроков ждёт ответа «Colonel Arhci» по atlantiamail.
Going faster than memcpy
Как обогнать memcpy
Профилируя Shadesmar, увидел: при больших (>512 КБ) сообщениях 97 % времени уходит на memcpy
между процессной и разделяемой памятью. Решил ускорить копирование.
Разбор memcpy
perf
показал:
__memmove_avx_unaligned_erms
— это memcpy
через memmove
, AVX, 32 байта за раз, поддержка не выровненных блоков и ERMS (железный цикл REP MOVSB
).
memmove
выбран, т.к. допускает перекрытие.- Для <4 КБ используется SSE2, иначе —
REP MOVSB
+ AVX. - Не-временные (
NT
) инструкции иprefetcht0
уменьшают кэш-промахи.
Способ 1: простой REP MOVSB
void _rep_movsb(void *d, const void *s, size_t n) {
asm volatile("rep movsb"
: "=D"(d), "=S"(s), "=c"(n)
: "0"(d), "1"(s), "2"(n)
: "memory");
}
Тот же цикл, что и в glibc
, но без лишней логики.
Комментарии (63)
- Часть выгоды даёт отказ от лишнего копирования: часто данные можно использовать на месте.
- Несколько участников отмечают, что без контроля кэшей и правильной сериализации бенчмарки теряют смысл.
- График в конце вызывает сомнения: скачки пропускной способности выглядят неправдоподобно.
- Для IPC обсуждают zero-copy через размещение данных сразу в shared memory (Iceoryx, Boost.Interprocess, DPDK).
- Большинство сходится к выводу: для обычных задач лучше довериться стандартному
memcpy
/std::memcpy
, особенно в glibc.