Все о цифрах на лыжах atomic 2021-2022: таблицы, структуры, жесткость, технологии

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++ состоит в том, что они несут сразу три функции. Так на каких же трех слонах держатся атомики?

  1. Атомики позволяют реализовать… атомарные операции.

  2. Атомики накладывают ограничения на порядок выполнения операций с памятью в одном потоке.

  3. Синхронизируют память в двух и более потоках выполнения.

Атомарная операция — это операция, которую невозможно наблюдать в промежуточном состоянии, она либо выполнена либо нет. Атомарные операции могут состоять из нескольких операций. Если говорить про тип std::atomic, то он предоставляет ряд примитивных операций: , , , и другие. Последние две операции — это read-modify-write операции, атомарность которых обеспечивается специальными инструкциями процессора.

Рассмотрим простой пример read-modify-write операции, а именно прибавление к числу единицы. Пример 0, link:

В случае с обычной переменной  типа int имеем три отдельных операций: read-modify-write. Нет гарантий, что другое ядро процессора не выполняет другой операции над . Операция над в машинных кодах представлена как одна операция с lock сигналом на уровне процессора, гарантирующим, что к кэш линии, в которой лежит , эксклюзивно имеет доступ только ядро, выполняющее эту инструкцию.

Про ограничения на порядок выполнения операций. Когда мы пишем код программы, то предполагаем, что операторы языка будут выполнены последовательно. В реальности же компилятор и в особенности процессор могут переупорядочить команды программы с целью оптимизации. Они это делают с учетом ограничений на порядок записи и чтения в локацию памяти. Например, чтение из локации памяти должно происходить после записи, эти операции нельзя переупорядочить. Применение атомарных операций может накладывать дополнительные ограничения на возможные переупорядочивания операций с памятью.

Про синхронизацию данных между потоками. Если мы хотим изменить данные в одном потоке и сделать так, чтобы эти изменения были видны в другом потоке, то нам необходимы примитивы многопоточного программирования. Фундаментальным таким примитивом являются атомики, остальные, например мьютексы, либо реализованы на основе атомиков, либо повторяют семантику атомиков. Все попытки записывать и читать одни и те же данные из разных потоков без примитивов синхронизации могут приводить к UB.

Случаи, когда синхронизация памяти не требуется:

  1. Если все потоки, работающие с одним участком памяти, используют ее только на чтение

  2. Если разные потоки используют эксклюзивно разные участки памяти

Далее будет рассмотрены более сложные случаи, когда требуется чтение и запись одного участка памяти из разных потоков. Язык 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 атомарные операции вместо мьютекса, там где это возможно. Данная статья помогла мне систематизировать материал, который я находил в разных источниках и освежить знания в памяти. Надеюсь, она поможет и вам!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector