Все о цифрах на лыжах atomic 2021-2022: таблицы, структуры, жесткость, технологии
Содержание:
- Atomic Redster Gen S — главная новинка Atomic 2021-2022
- Синхронизация пары. Acquire/Release
- Базовый пластик Atomic
- Подбор беговых лыж Atomic по весу: инструкция, таблицы
- Неделимый, но расслабленный
- Три слона
- Семантика acquire/release классов стандартной библиотеки
- Конструкции лыж Atomic
- Технологии и строение лыж Atomic
- Цифры промеров жесткости на лыжах Atomic
- Заключение
Atomic Redster Gen S — главная новинка Atomic 2021-2022
Atomic подготовили к сезону 2021-2022 совершенно новые коньковые лыжи — Atomic Redster Gen S. Это не какие-то косметические улучшения, а совершенно новые лыжи, которые вызывают даже немного удивления.
Основные изменения:
- Speedscale — один размер для всех — 183 см. По мнению разработчиков, такой длины достаточно для отличного скольжения и устойчивости лыж с этой конструкцией.
- Speedline — профиль 47-40-47 мм (для сравнения Atomic Redster S9 Carbon имеет профиль 41-43-43,5 мм). Сделано это по аналогии с горными лыжами. По задумке при отталкивании лыжи будут «закладывать дугу» к внутренней части траектории движения, а не на внешнюю сторону, как обычные беговые лыжи. Это должно придать ускорение и увеличить скорость на дистанции.
- Racewall — новая конструкция боковины. Увеличенная передача мощности и стабильность. Боковина не только передает усилие, но и скользит, подобно Fischer 3D.
В теории задумка классная, посмотрим, приживутся ли новые лыжи у профессионалов. В любом случае Atomic радует радикальными обновлениями в отличие от других крупных брендов.
Синхронизация пары. Acquire/Release
Флаг синхронизации памяти является более тонким способом синхронизировать данные между парой потоков. Два ключевых слова: и работают только в паре над одним атомарным объектом. Рассмотрим их свойства:
-
модификация атомарной переменной с будет видна видна в другом потоке, выполняющем чтение этой же атомарной переменной с
-
все модификации памяти в потоке , выполняющей запись атомарной переменной с , будут видны после выполнения чтения той же переменной с в потоке
-
процессор и компилятор не могут перенести операции записи в память раньше операции в потоке , и нельзя перемещать выше операции чтения из памяти позже операции в потоке
Важно понимать, что нет полного порядка между операциями над разными атомиками, происходящих в разных потоках. Например, в примере 4 если все операции заменить на , а операции заменить на , то значение после выполнения программы может быть равно 0, 1 или 2
Это связано с тем, что, независимо от того в каком порядке по времени выполнения выполнены для и , потоки и могут увидеть эти изменения в разных порядках. Кстати, такими же изменениями для и можно исправить пример 3. Такое изменение будет корректным и производительными, т.к. тут нам не требуется единый порядок изменений между всеми потоками (как в случае с ), а требуется синхронизировать память между двумя потоками.
Используя , мы даем инструкцию, что данные в этом потоке готовы для чтения из другого потока. Используя , мы даем инструкцию «подгрузить» все данные, которые подготовил для нас первый поток. Но если мы делаем и на разных атомарных переменных, то получим UB вместо синхронизации памяти.
Рассмотрим реализацию простейшего мьютекса, который ожидает в цикле сброса флага для того, чтобы получить . Такой мьютекс называют
Это не самый эффективный способ реализации мьютекса, но он обладает всеми нужными свойствами, на которые я хочу обратить внимание. Пример 5, link:
Функция непрерывно пробует сменить значение с false на true с модификатором синхронизации памяти . Разница между и незначительна, про нее можно почитать на cppreference. Функция выставляет значение в false с синхронизацией
Обратите внимание, что мьютекс не только обеспечивает эксклюзивным доступ к блоку кода, который он защищает. Он также делает доступным те изменения памяти, которые были сделаны до вызова в коде, который будет работать после вызова
Это важное свойство. Иногда может сложиться ошибочное мнение, что мьютекс в конкретном месте не нужен
Рассмотрим такой пример, называемый Double Checked Locking Anti-Pattern из . Пример 6, link:
Идея проста: хотим единожды в рантайме инициализировать объект . Это нужно сделать потокобезопасно, поэтому имеем мьютекс и флаг инициализации. Т.к. создается объект единожды, а используется указатель в read-only режиме всю оставшуюся жизнь программы, то кажется разумным добавить предварительную проверку . Данный код будет корректно работать на архитектурах процессора с более строгими гарантиями консистентности памяти, например в x86-64. Но данный код неверный с точки зрения стандарта C++. Давайте рассмотрим такой сценарий использования:
Рассмотрим следующую последовательность действий во времени:
1. сначала отрабатывает -> выполняет инициализацию под мьютексом:
-
lock мьютекса ()
-
unlock мьютекса ()
2. далее в игру вступает :
-
возвращает (память, где содержится могла быть неявно синхронизирована между ядрами процессора)
-
приводит к (указатель не обязан был быть синхронизирован с потоком )
Этот случай интересен тем, что наглядно показывает роль мьютекса не только как примитива синхронизации потока выполнения, но и синхронизации памяти.
Базовый пластик Atomic
Информация о базовых пластиках Atomic так же странно изменилась к сезону 2019-2020. Bl 1500, Bl 2000 и Bl 3000 до 2019 года характеризовались как низкомолекулярный пластик, среднемолекулярный и высокомолекулярный соответственно. Теперь же они все экструдированные.
- Bl 1000 (не ставится на лыжи Atomic с 2018 года) — низкомолекулярный пластик начального уровня. Универсален в условиях использования, содержит 3,5% графита. Почти не впитывает парафин. Подойдут самые простые смазки быстрого нанесения.
- BI 1500 — экструдированный пластик начального уровня. Универсален и не требует обслуживания.
- Bl 2000 — экструдированный пластик начального уровня. Универсален и не требует обслуживания.
- BI 3000 — экструдированный пластик начального уровня. Универсален и не требует обслуживания.
- BI 4000 — универсальная поверхность профессионального уровня. Содержит 20% графита, хорошо принимает смазку и требует регулярного ухода.
- BI 5000 — база уровня Кубка Мира. Содержит 25% графита, хорошо принимает смазку и требует регулярного ухода. Сравнима с Salomon G5.
- BI 5000 SA — улучшенная версия Bl 5000, содержит 25% графита и 6% специальной добавки. Атомик не разглашает ее состав.
- BI 5000 CB — прозрачный пластик без графита для искусственного, грязного, водянистого, крупнозернистого снега. Ставится на лыжи Plus.
- BI 6000 — новая база Atomic сезона 2019-2020. Ставится на Redster S9 Carbon, C9 Carbon, C9 Carbon Skintec. По заявлениям производителей, содержит 10% «специальной добавки» для улучшения скольжения.
Структуры Atomic
Если на лыжах нет специального стикера с отметкой структуры, значит нанесена одна из стандартных:
- Синяя конструкция (Cold) — код структуры неизвестен, t от −10 и холоднее
- Желтая конструкция (UNI) — код структуры неизвестен, t от −2 до −15
- Красная конструкция (Plus) — код структуры неизвестен, t от −5 и теплее
Доступные структуры для лыж из предзаказа:
- AC 3 — скандинавская холодная структура на −8/-17.
- AC 4 — все типы снега на −5 и ниже.
- AC 5 — все типы снега на от −8 и холоднее. Подходит для регионов России.
- AM 2 — свежий, влажный, слегка подмороженный снег при −1/-8
- AM 3 — все типы натурального и искусственного снега −2/-10.
- АМ 6 — структура на +1/-8. Подходит на все типы снега, отлично работает на крупнозернистом снегу после оттепели.
- AM 7 — универсальная структура на −4/-12, хорошо работает на свежем холодном снегу. Подходит для большинства регионов России.
- AW 1 — влажный и мокрый снег на 0/-4.
- AW 2 — структура на высокую влажность и водянистый снег.
- AW 4 — крупнозернистый снег при 0/-2. Хорошо работает поздней весной в России. Дополняется ручной накаткой.
- AW 7 — крупнозернистый, падающий мокрый снег при −5/+5. Хорошо работает поздней весной в России. На водянистый снег дополняется накаткой.
- AW 8 — весенняя структура на −5/+10.
Структуры наносятся в Альтенмаркте (буква A в коде — Альтенмаркт, W — warm, C — cold, M — medium). До сезона 2019-2020 структуры были общими с Salomon. Теперь у каждого бренда свои, но лыжи Salomon со структурами A еще есть в магазинах.
Подбор беговых лыж Atomic по весу: инструкция, таблицы
Гоночные классические лыжи Atomic подбираются по стикеру Your ski — простой и понятный способ подобрать лыжи без заучивания сложных показателей.
По цвету квадрата в графике определяем конструкцию лыж (желтый, красный, синий). По оси Y — вес, по оси X — высота колодки. По стикеру лыжи подходят на 72-94 кг (вся длина оси Y). Смотрим показатель FT (HBW). При 90 кг лыжи прижмутся до 0,8 мм, при 80 кг — до 1,1 мм. Чем больше зазор, тем большее усилие нужно для закрытия колодки и тем меньше будет тормозить мазь держания в фазе проката. Эта пара подойдет любителю весом 85-90 кг и подготовленному спортсмену весом 80-85 кг.
Стикер Atomic Your Ski для классических лыж
Разница стикеров классических (слева) и коньковых (справа) лыж. У классики широкий допустимый диапазон работы лыж, а цветная область — идеальный вес. У коньковых лыж рекомендуемый диапазон веса уже и ограничен цветной областью.
Устаревшая система подбора лыж Atomic по FT
Для более точного подбора коньковых лыж Atomic рекомендует пользоваться показателем FT. Например, лыжи с диапазоном веса 75-95 кг с FT 2,4 подойдут на 75 кг, а с FT 3.0 — на 95 кг. Не забывайте, что это условные показатели. Подбор лыж во многом зависит от уровня подготовки спортсмена и типа трассы.
В сезоне 2019-2020 снова появилась формула расчета приблизительного MF, хотя раньше Atomic не рекомендовал пользоваться MF для подбора своих лыж.
- Формула для лыжников-любителей: MF=вес лыжника * 1,1. Например, при весе лыжника 85 кг MF=94 (± 3 единицы).
- Формула для подготовленных лыжников-гонщиков: MF=вес лыжника * 1,2. Например, при весе 85 кг MF=102 (± 3 единицы).
Неделимый, но расслабленный
Самый простой для понимания флаг синхронизации памяти — . Он гарантирует только свойство атомарности операций, при этом не может участвовать в процессе синхронизации данных между потоками. Свойства:
-
модификация переменной «появится» в другом потоке не сразу
-
поток «увидит» значения одной и той же переменной в том же порядке, в котором происходили её модификации в потоке
-
порядок модификаций разных переменных в потоке не сохранится в потоке
Можно использовать модификатор в качестве счетчика. Пример 1, link:
Использование в качестве флага остановки. Пример 2, link:
В данном примере не важен порядок в котором увидит изменения из потока, вызывающего
Также не важно то, чтобы мгновенно (синхронно) увидел выставление флага в
Пример неверного использования в качестве флага готовности данных. Пример 3, link:
Тут нет гарантий, что поток увидит изменения ранее, чем изменение флага , т.к. синхронизацию памяти флаг не обеспечивает.
Три слона
На мой взгляд, основная проблема с атомиками в C++ состоит в том, что они несут сразу три функции. Так на каких же трех слонах держатся атомики?
-
Атомики позволяют реализовать… атомарные операции.
-
Атомики накладывают ограничения на порядок выполнения операций с памятью в одном потоке.
-
Синхронизируют память в двух и более потоках выполнения.
Атомарная операция — это операция, которую невозможно наблюдать в промежуточном состоянии, она либо выполнена либо нет. Атомарные операции могут состоять из нескольких операций. Если говорить про тип std::atomic, то он предоставляет ряд примитивных операций: , , , и другие. Последние две операции — это read-modify-write операции, атомарность которых обеспечивается специальными инструкциями процессора.
Рассмотрим простой пример read-modify-write операции, а именно прибавление к числу единицы. Пример 0, link:
В случае с обычной переменной типа int имеем три отдельных операций: read-modify-write. Нет гарантий, что другое ядро процессора не выполняет другой операции над . Операция над в машинных кодах представлена как одна операция с lock сигналом на уровне процессора, гарантирующим, что к кэш линии, в которой лежит , эксклюзивно имеет доступ только ядро, выполняющее эту инструкцию.
Про ограничения на порядок выполнения операций. Когда мы пишем код программы, то предполагаем, что операторы языка будут выполнены последовательно. В реальности же компилятор и в особенности процессор могут переупорядочить команды программы с целью оптимизации. Они это делают с учетом ограничений на порядок записи и чтения в локацию памяти. Например, чтение из локации памяти должно происходить после записи, эти операции нельзя переупорядочить. Применение атомарных операций может накладывать дополнительные ограничения на возможные переупорядочивания операций с памятью.
Про синхронизацию данных между потоками. Если мы хотим изменить данные в одном потоке и сделать так, чтобы эти изменения были видны в другом потоке, то нам необходимы примитивы многопоточного программирования. Фундаментальным таким примитивом являются атомики, остальные, например мьютексы, либо реализованы на основе атомиков, либо повторяют семантику атомиков. Все попытки записывать и читать одни и те же данные из разных потоков без примитивов синхронизации могут приводить к UB.
Случаи, когда синхронизация памяти не требуется:
-
Если все потоки, работающие с одним участком памяти, используют ее только на чтение
-
Если разные потоки используют эксклюзивно разные участки памяти
Далее будет рассмотрены более сложные случаи, когда требуется чтение и запись одного участка памяти из разных потоков. Язык C++ предоставляет три способа синхронизации памяти. По мере возрастания строгости: , и . Рассмотрим их.
Семантика acquire/release классов стандартной библиотеки
Механизм поможет понять гарантии синхронизации памяти, которые предоставляют классы стандартной библиотеки для работы с потоками. Ниже приведу список наиболее часто используемых операций.
vs функция потока |
Вызов конструктора объекта () синхронизирован со стартом работы функции нового потока (). Таким образом функция потока будет видеть все изменения памяти, которые произошли до вызова конструктора в исходном потоке. |
vs владеющий поток |
После успешного вызова поток, в котором был вызван join, «увидит» все изменения памяти, которые были выполнены завершившимся потоком. |
vs |
успешный lock синхронизирует память, которая была изменена до вызова предыдущего unlock. |
vs |
синхронизирует память с успешным . |
И так далее. Полный список можно найти в книге .
Что это все значит? Повторю эту важную мысль еще раз: это значит, на примере и , что тут мы не только получили данные, которые содержатся в примитиве синхронизации, но и нам доступны все изменения памяти, которые были в потоке до того, как он выполнил . Это маленькое чудо нам кажется само собой разумеющееся с нашим бытовым, последовательным причинно-следственным, взглядом на мир. Но в мире многоядерного процессора, законы которого больше похожи на квантовую физику, которую никто до конца не понимает, нет единого последовательно порядка изменения памяти в разных ядрах процессора, если это не затребовано разработчиком явно, или неявно через многопоточные примитивы.
Конструкции лыж Atomic
В топовых коньковых лыжах Atomic Redster S9 Carbon используются 2 конструкции:
- Желтые (UNI) — универсальная конструкция
- Красные (Plus) — конструкция для теплых условий и мягкого влажного снега, прозрачная поверхность без графита
Коньковые Atomic Redster S9 бывают только с универсальной желтой конструкцией.
В классических Atomic Redster Carbon используются 3 конструкции:
- Синяя (Cold) — под холодные условия и твердые мази. Низкая высота прогиба (HBW) — от 0,8 до 1,1 мм
- Желтая (UNI) — универсальная конструкция под твердые и полутвердые мази. Средняя высота прогиба (HBW) — от 1,0 до 1,3 мм
- Красная (Plus) — конструкция под теплые условия и жидкие мази. Высокая арка прогиба (HBW) — от 1,3 до 1,7 мм
Высота прогиба — то же, что называют «жесткость мыска и пятки», смысл это не меняет. Жесткость мыска и пятки влияет на высоту прогиба. Чем более высокий прогиб, тем выше колодка поднимается над лыжней во время проката. Поэтому для жидких мазей нужна высокая арка, чтобы не мешать скольжению.
Технологии и строение лыж Atomic
Технология SDS (Short Distance Step) — специальные вставки в области зоны держания на классических лыжах. По заявлениям производителей слегка приподнимает зону колодки, что не дает мази держания тормозить в фазе скольжения. При этом общая жесткость лыж сохраняется.
Сердечники лыж Атомик в разрезе
Nomex с SDS — самый легкий сердечник, ставится на топовые модели. На фото лыжи Atomic World Cup Classic с технологией SDS (слой между скользящим пластиком и сотовой структурой).
Nomex с SDS
Nomex — самый легкий сердечник, ставится на топовые модели.
Nomex
Densolite и Nomex. На фото разрез лыж Atomic Race. Такое сочетание сердечников уже не используется. Теперь Atomic в лыжах S7 и S5 использует Speedcell — сочетание Densolite и «особого пористого материала».
Densolite и Nomex
Densolite. Существует денсолайт разной плотности: 1000, 2000 и 3000. Чем больше цифра, тем более пористый и легкий материал. Используется в Atomic S5 и ниже.
Densolite 4000
Цифры промеров жесткости на лыжах Atomic
В центре со знаком гирьки пишется усилие в килограммах, которое используется для снятия показателей и фиксировано для каждой длины лыж — SLF. На лыжах с индивидуальным подбором на дополнительном стикере указывается в верхнем правом углу. SLF (Ski length factor) — определенное усилие, которое фиксировано для каждой длины лыж. Оно необходимо для получения показателя FT. Нагрузка прикладывается в 8 см ниже точки баланса.
На наклейке лыж с дополнительными промерами указаны все промеры:
- L1 — длина колодки в см от центра лыжи вперед после приложения усилия SLF
- L2 — длина колодки в см от центра лыжи назад после приложения усилия SLF
- L3 — расстояние от наивысшей точки колодки до точки баланса лыжи при усилии в SLF
- VSP — высота колодки в точке баланса без приложения усилия
- FT (Final tension) — то же H3 и HBW — высота колодки в мм в самой высокой точке после приложения усилия в SLF
- MF — нагрузка, которую нужно приложить в 8 см ниже точки баланса, для сжатия колодки до 0,2 мм
Все показатели аналогичны Salomon. Более подробно о всех показателях мы писали в статье Все о цифрах на лыжах Salomon: структуры, эпюры, MF, HBW, L1, L2, H3.
Обратите внимание, что Salomon заявляет точку в 7 см, Atomic — 8 см, Fischer — 7 см. В источниках бывают расхождения, в одном месте пишут 8 см, в другом 7 см
На практике это не так важно. На лыжах бегают люди, а не роботы, у всех разная техника, распределение нагрузки по стопе и т
д. Примерно 7-8 см — этой информации вполне достаточно.
Заключение
Сложно представить современную C++ программу, которая была бы однопоточной. Опасно писать многопоточные программы, не имея представления о правилах синхронизации памяти. Я считаю, что нужно знать, как работают атомики в C++. Чтобы не совершать ошибок типа , чтобы понимать, какие изменения в каких потоках будут видны после использования того или иного многопоточного примитива, чтобы использовать read-modify-write атомарные операции вместо мьютекса, там где это возможно. Данная статья помогла мне систематизировать материал, который я находил в разных источниках и освежить знания в памяти. Надеюсь, она поможет и вам!