Пора перенести измерение длины на «Флиппер»
Кажется я то ли прокрастинирую, то ли боюсь неудачи. Предполагалось, что векторизованный алгоритм измерения длины строки в кодировке
Он вполне может не скомпилироваться — не уверен, что на «Флиппере» есть
Полтора
Не раз приходила в голову мысль, что «полтора» — это
Сегодня я узнал, что «полтора» — это «полвтора». Была
Полвторого на часах — это ровно то же самое.
ARM бывают разные
Преодолев внутреннее сопротивление, я
Во «Флиппере» стоит процессор ARM, а они, как оказалось, бывают очень разные.
Я ещё в самом начале посмотрел спецификацию процессора «Флиппера» и, увидев слово SIMD, совершенно успокоился — в моём понимании это означало, что я могу использовать любые команды векторизации, которые мне необходимы. Тут я немного поторопился, но меня подгоняло желание разобраться как устроена векторизация. Теорию я знал, а тут подвернулась, пусть немного синтетическая, но задача, которую руки чесались решить.
Как я уже говорил, мне захотелось срезать углы, поэтому функцию до этого момента я писал на своём ноутбуке, раз так случилось, что у меня на нём тоже процессор ARM. И лишь сегодня я попробовал вставить её в одну из своих программ и собрать её для «Флиппера».
Сначала компилятор заявил мне, что не нашёл некоторые векторные функции, в частности функцию нахождения минимума vminvq_u8 и суммы vaddvq_u8.
Ветку с vminvq_u8 я временно убрал, а функцию суммы vaddvq_u8 решил заменить на поэлементное сложение (vaddq_u8), которая, вроде, компилятору знакома.
Мысль простая — в векторах, сумму которых мы находим, на каждой позиции нули и единицы, поскольку каждый элемент вектора у нас восьмибитный, в общем случае у нас поместится результат 255 операций, а потом я могу просто просуммировать элементы циклом.
uint8x16_t len_v = vdupq_n_u8(0);
int reset = 0;
// тут у нас цикл
uint8x16_t gt = vcgtq_s8(operand, threshold);
len_v = vaddq_u8(vandq_u8(gt, delta), len_v);
if (++reset >= 255) {
for (size_t i = 0; i < sizeof(uint8x16_t); i++) {
len += *((uint8_t *)&len_v + i);
}
reset = 0;
len_v = vdupq_n_u8(0);
}Я был очень доволен решением (оно не совсем моё, его мне навеял код, используемый в PHP), но оказалось, что оно тоже не компилируется.
Сборка заругалась на ошибку target specific option mismatch, означающую, что указанное при компиляции железо не поддерживает те возможности, которые я пытаюсь использовать в коде. Пришлось лезть в тулчейн, чтобы разобраться какие ключи компиляции сейчас используются.
В файле compile_commands.json можно увидеть, что при сборке используется ключ -mfpu=fpv4-sp-d16, тогда как мне, чтобы использовать нужные команды векторизации нужен ключ -mfpu=neon.
Так как ключи компиляции указывали разработчики «Флиппера», думаю, они в точности знали в какие значения их выставить. Согласно спецификации на борту использованного во «Флиппере» процессора SIMD есть, но, видимо,
DSP SIMD для Flipper Zero
В этом версии нет никакой защиты цикла от чтения за границей буфера, мне показалось, что во «Флиппере» это неважно, но возможно это не так.
Ну что ж, разобрался я что за зверь такой этот DSP SIMD и запрограммировал на нём векторизированную версию функции для измерения длины строки.
Сегодня описывать и замерять уже не буду, и так времени много ушло, но по крайней мере всё работает на настоящем «Флиппере».
Сразу можно заметить, что вектора тут вдвое короче — всего четыре байта, да и функций для работы с ними гораздо меньше, но этого набора оказалось достаточно, чтобы всё векторизовать.
#include <arm_acle.h>
size_t strlen_arm_utf8(char * str) {
uint32_t len = 0;
int8x4_t zero = 0x00000000;
int8x4_t one = 0x01010101;
int8x4_t threshold = -1077952577; // -65, -65, -65, -65
for (;;) {
uint8x4_t result;
int8x4_t vec = *(int8x4_t *) str;
__uadd8(0xFFFFFFFF, vec); result = __sel(zero, one);
if (result > 0) {
if (result == 0x01000000) {
__ssub8(threshold, vec); result = __sel(zero, one);
return __usada8(result, 1, len);
}
break;
}
__ssub8(threshold, vec); result = __sel(zero, one);
len = __usada8(result, zero, len);
str += sizeof(uint8x4_t);
}
for (signed char c; (c = *str); str++) {
if (c >= -64) {
len++;
}
}
return len;
}
«Щенячья школа»
Интересно, что дочка частенько вдохновляется в своих поделках фильмами, которые мы смотрим. Если они ей нравятся, разумеется.
Недавно смотрели документальный фильм про обучение
После него у нас появилось несколько собак, собранных из «Лего» и бумажный двухэтажный приют для щенков, сделанных из пластика и пластелина.
Энтекофобия
Например, если мне надо отсчитать четырнадцать повторов, я лучше разобью это число на десять и четыре, на два раза на семь или ещё
Замеры strlen_uft8 на «Флиппере Зеро»
Ну что же, я наконец сравнил свой вариант функции определения длины строки в кодировке
Оказалось, что обычные функции замера времени под «Флиппером» не работают. мне не удалось получить значение текущего времени ни одним из способов к которым я привык на Си, поэтому опять пришлось читать исходники прошивки «Флиппера».
В итоге обнаружился метод, выводящий затраченное время с секундной точностью:
FuriHalRtcDateTime curr_dt;
furi_hal_rtc_get_datetime(&curr_dt);
uint32_t start = furi_hal_rtc_datetime_to_timestamp(&curr_dt);
for (int i = 0; i<1000000; i++)
len += strlen_utf8("This is a test и русских букв тоже");
furi_hal_rtc_get_datetime(&curr_dt);
uint32_t stop = furi_hal_rtc_datetime_to_timestamp(&curr_dt);Хотелось бы точнее, но этого, в принципе, хватает, чтобы понять какая функция быстрее и на сколько. Надо просто сделать очень много итераций. Я попробовал запускать на миллионе и десяти миллионах.
В итоге, на десяти миллионах наивная реализация выполняется примерно за 80 секунд, моя и чужая быстрая — около 50, явного лидера из этих двух реализаций выделить не удалось. Все замеры делал несколько раз.
Небольшой отпуск
У меня тут небольшой отпуск — взял со среды неделю, чтобы посидеть в тишине. На Новогодних почилить не получилось — работа не позволила. А тут ещё и жена на защиту тренерского диплома по психологии в Москву улетела и, чтобы не мучаться проблемой того, кто будет забирать дочку из школы (её надо забирать раньше, чем я заканчиваю работу), решил убить двух зайцев одним махом.
Заставляю себя не думать о работе, но по инерции мысли всё равно туда скатываются. Ну хотя бы рабочие чаты удаётся не читать. А вот что не удаётся — это выспаться. Я, как уже много раз писал, — «сова», а поскольку дочку надо отправлять в школу (она ездит на школьном автобусе), вставать приходится в обычные 6:30 утра.
Тем не менее, потихоньку отдыхаю, размякаю, чувствуется как разжимается кулак постоянной концентрации в голове. Неделя — это мало, конечно, но больше пока не могу себе позволить.
Репер 1890 года
Ходил сегодня в музей Лобачевского на территории КФУ — вуза, где я
После музея немного погулял по территории и на здании кафедры астрономии и космической геодезии увидел репер — геодезическую метку. Я только недавно начал обращать на них внимание, когда узнал, что в нашем городе есть несколько ещё дореволюционных времён.
Дискета на 90 мм
Некоторое время назад я прочитал в «Википедии», что дискета на 3,5 дюйма на самом деле метрическая и её ширина — 90 миллиметров, а вовсе не 88,9 как должно было бы быть. Поскольку «Википедия» источник сомнительный, я решил это проверить — нашёл дома дискету и ещё одну купил. Замерил обе линейкой. Получилось примерно 88,9 миллиметров.
Многие засомневались в точности моей линейки, несколько читателей даже замерили свои дискеты штангенциркулем и все замеры совпали с тем, что написано в «Википедии» — получилось 90 миллиметров.
Поскольку покупать штангенциркуль мне не хотелось, поспрашивал по друзьям и знакомым. У одного из товарищей
Всё это время мы никак не могли пересечься, но сегодня он
Заодно разобрал дискету и померил сам диск. Получилось
Любовь и химия
Интересно, но при всей своей увлечённости наукой — я подписан на очень много разноплановых
Ну там прервать несчастную любовь или возродить погасшую. Не знаю какая там статистика по сердечным страданиям, а по разводам слышал, что в России распадается более 70% браков. Как мне кажется, это очень много. Хочется думать, что сходились эти пары по любви, ну хоть в большей части.
В выходные вёз дочку на такси за город. Обычно я не люблю разговаривать с таксистами, но тут дорога была дальняя, дочка спала. Таксист оказался неплохим парнем и мы много чего с ним обсудили. В основном он мне рассказывал про свою жизнь, а я слушал.
Я и раньше знал, что есть пары, которые живут как соседи, — среди моих знакомых такие встречаются. Вместе
С таксистом эту тему я не стал развивать —
Возвращаясь к науке.
Вот интересно — я на такие исследования не натыкался, потому что не искал или просто их нет
Какой же купить смартфон?
Продолжаю неспешно выбирать себе новый смартфон. Как я уже ворчал, на третий год жизни с «Хуавеем» у меня накопилось много претензий и хочется переехать
Главная претензия связана с тем, что «Хуавей» отлучили от сервисов Гугла.
Я думал, что смогу с этим жить, в момент покупки это не выглядело проблемой, но на долгосрочной дистанции сильно задолбало.
Второй набор претензий к самому устройству, — у меня раскладной Mate Xs 2. Несмотря на то, что это не первое поколение раскладных устройств, недостатков у него хватает — довольно компромиссная камера, временами неустойчивый приём, аккумулятора хватает только до вечера, иногда с натягом.
Широкий экран — это шикарно, но поверх него специальная плёнка, которую
В общем, очень я настроился смартфон поменять. Только вот на что? Посмотрел несколько обзоров, даже вспомнил, что знаю одного из техноблогеров с канала «Дроидер» — снимали
Пока фаворит по всем моим хотелкам — Oppo Find X7 Ultra. Стандартный магазин приложений, бомбические камеры, глобальная гарантия на весь мир, топовое железо. Хотя до сих пор продолжаю изучать рынок, всё больше склоняюсь к покупке именно этого устройства.
Песенный и разговорный языки
В последнее время часто смотрю разборы преподавателем вокала Джоном Каллиганом творчества различных исполнителей. У меня как будто бы неплохой слух, но я совершеннейший ноль в теории, несмотря на то, что в детстве занимался музыкой и даже немного попел в хоре. Без особого успеха, правда.
В общем, мне интересно это посмотреть, как раз потому что я ничего в этом не понимаю.
Так вот, Джон, в разборе вокала Шевчука, сказал интересную штуку, о которой я
На английском мне всегда было гораздо сложнее понимать песни, даже в те периоды, когда я хорошо понимал английскую речь (уровень аудирования у меня постоянно скачет в течение жизни).
Возможно это потому, что я чаще тренируюсь распознавать речь и этот навык мало что даёт в плане распознавания слов в песнях
Киргизский самовар
Почти три года назад я летал на международный форум в Киргизию и до сих пор иногда вспоминаю ту поездку. Принимали нас по высшему разряду, большое спасибо киргизской стороне, тут выше всяческих похвал.
Но чаще всего я вспоминаю совершенно неожиданное — самостройное место для отдыха по пути
Выглядит оно довольно простенько, но меня сильно зацепил там один нюанс. Дело в том, что на первой линии там стоят огромные дровяные самовары, которые я рассматривал бы, наверное, часами, дай мне волю.
Все самовары, которые мне удалось рассмотреть (а времени было не так уж много), — дореволюционные, очень красивые, с клеймами производителей и медалями за победу во всевозможных выставках.
Каждому более ста лет, где их взяли — ума не приложу. По всей видимости, специально никто именно дореволюционные не подбирал, думаю соображения сугубо практические — с электричеством на этом островке плохо, а дровяные самовары именно тогда делали очень качественные, да ещё огромных объёмов.
Шутка, которая не работает
Тут в чате бывших коллег, где мы постим мемы, пробежала картинка, которая больше повеселила меня не смыслом, который в неё вкладывал автор, а тем, что на системе, под которую написан код на ней (Виндоуз, очевидно), она не выполнится.
Проблема тут в том, что вызов os.remove умеет удалять только файл, тогда как System32 — папка, знакомая многим пользователям Виндоуз. Я не уверен точно, но думаю, что при её удалении система будет сопротивляться. Она, вроде,
Возможно, кстати, код и не предполагалось делать рабочим, а шутка немного тоньше — ведь вызов os.remove можно прочитать как «удалить операционную систему», не знаю, я в любом случае хотел рассказать не об этом.
Дело в том, что шутка написана под ОС, под которой она работать не будет, но смешно то, что под ОС, на которую она рассчитана не была, она вполне может заработать.
В Линуксе или МакОСи надо в любом месте, где будет запускаться эта программа, создать папку C:, в ней — папку Windows, а в ней — файл System32, который и удалится, если выпадет искомое число на рандомайзере.
Надо бы добавить мой strlen во «Флиппер»
Можно подумать, что я забросил возню с «Флиппером», так как
До недавнего времени я её надеялся ускорить, поэтому пытался вносить
Будем считать, что с этим вопросом я закончил, хочу теперь попробовать добавить этот код в прошивку «Флиппера». Остались сделать два шага.
На замерах моя реализация обогнала встроенную на порядок — восемь секунд против 55 на двух миллионах итераций по небольшой строке. Но теперь надо воткнуть её в прошивку, чтобы учесть влияние реализации строкового типа FuriString, в котором будет использоваться эта функция и провести новые замеры. Надеюсь сделать это в ближайшие выходные.
Второй шаг для меня сложнее. У меня уже есть выписанная прошивка «Флиппера», в которой торчит непринятый коммит. Я никогда раньше не создавал на «Гитхабе» два разных запроса в рамках одного чужого проекта, не знаю как это делается. Если
«Жгонский язык» А. В. Громова
Один из друзей поделился проектом по некоторым узким разделам истории Казани, который он делает потихоньку в свободное время. В рамках этого проекта он разыскивает целую гору различной редкой литературы, которой не то что онлайн, даже в твёрдом виде сложно отыскать.
Я ему попытался помочь и в некоторых позициях даже преуспел. Особенно хочу выделить книжку Александра Вячеславовича Громова «Жгонский язык», которую
Книжка редкая — выпущено было всего 500 экземпляров, но интересна, конечно, только очень узким специалистам.
Жгонский язык — тайный язык ремесленников, изготавливавших валенки. Как следует из слова «тайный», нужен был, чтобы оберегать профессиональные секреты от посторонних.
Был очень распространён в деревнях и сёлах около Костромы, но к настоящему моменту почти вымер. На Ютубе можно найти отдельных людей, которые ещё его используют, но и они не вечные.
Книжка пришла, и у меня дилемма. С одной стороны, я очень трепетно отношусь к авторским правам — следую принципам добросовестного цитирования, всегда смотрю лицензию используемых изображений и так далее. С другой стороны книга «Жгонский язык» как будто бы совсем не коммерческий проект, но автор умер и из каких соображений он её издавал точно сказать нельзя.
В общем, мне хочется её отсканировать и выложить в открытый доступ, чтобы люди могли воспользоваться уникальным справочником, если он им нужен для исследований. С другой стороны — авторские права и всё такое. Попробую почитать на тему того не оставил ли Громов
Если нет, подарю книжку своему другу, уберу соблазн с глаз долой.
Сделал PR с новой strlen во «Флиппер»
Спасибо Шурику Бабаеву за помощь, добавил свой коммит с векторизованной функцией для измерения длины строки в кодировке
Попутно выяснилось, что «Флиппер» использует функцию замера длины из библиотеки M*LIB. Можно было бы закоммитить новую версию в неё, но не стал этого делать по двум причинам.
Кстати, сделал итоговые замеры. Миллион итераций с четырьмя короткими строками (от ЯБ12341 до ЯБ12341234) моя версия делает за шесть секунд, тогда как прежняя — за 39.
IAndex.Music
Почти пять лет назад я рассуждал про грядущую культурную разобщённость — думаю, что персонально генерируемый контент напрочь убьёт некоторые темы для разговоров. Не с кем будет обсудить понравившиеся фильм или книгу — как это сделать, если у каждого они свои?
За пять прошедших лет нейросети пока ещё не развились до такого уровня, но уже появилась возможность проверить мои рассуждения на практике. С момента появления сервиса «Моя волна» в «Яндекс.Музыке», я почти всю музыку слушаю там, совершенно не утруждая себя запоминанием исполнителей или отдельных композиций, которые в данный момент хорошо легли на моё настроение.
Кажется я мало подвержен музыкальной ностальгии, поэтому если трек вернётся в следующий раз, — очень хорошо, не вернётся — ну послушаю
Отложенные сообщения
Для меня один из самых важных рабочих инструментов «Телеграма» — отложенные сообщения. Я крайне редко использую их в личной переписке, зато постоянно по работе.
Как правило, на работу я приезжаю примерно за полчаса до начала рабочего дня. Потихоньку настраиваюсь на работу, просматриваю свои списки с задачами и создаю несколько отложенных сообщений, которые попадут в групповые чаты или личные сообщения с началом рабочего дня. Как правило это напоминания о регламентных работах или зависших вопросах.
Второй сценарий — когда мне приходит в голову
Разумеется есть несколько более редких сценариев использования, просто эти два у меня возникают постоянно. Если вы не используете отложенные сообщения, но у вас в голове иногда мелькает мысль
Проблемы лысых
У обеих наших машин панорамная крыша — стекло, прикрытое шторкой. Жена любит ездить с открытой шторкой, так как стекло сверху даёт ощущение простора. Я это могу понять, мне самому нравится. Чего, надеюсь, никогда в полной мере не поймёт моя жена — почему в мороз иногда мне приходится ездить в шапке. Шторка дают дополнительную теплоизоляцию, без которой у меня мёрзнет голова — я её брею налысо уже много лет.
«Аватар: легенда об Аанге»
Недавно по приходе с работы застал дочку, прыгающую по дивану и выкрикивающую «Аппа, Аппа,
Дочка им очень увлеклась и вот уже какую неделю смотрит. Аппа — это магический летающий бизон, друг главного героя,
При этом больше всего она зафанатела
Поскольку дочка очень любит изготавливать всё, что её впечатлило, Зуко тоже был немедленно воплощён — под него был загримирован и одет платонический друг
В кадр попала другая её поделка — кошелёк из кожи, к «Аватару…» он отношения не имеет, просто рядом лежал.
Не особо жажду смотреть оригинальный сериал, но планирую попробовать на вкус тематическую поделку от «Нетфликса». Фанаты её ругают,