Пользовательские атомарные операции с atomicCAS
Сравнение и обмен для произвольного обновления.
«Пользовательские атомарные операции с atomicCAS» — бесплатный урок CUDA Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения CUDA Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс CUDA Academy содержит 4 уроков всего.
Когда встроенных операций недостаточно
Встроенные атомарные операции поддерживают сложение, поиск максимума, обмен и другие действия. Но что делать, если нужна атомарная операция, которой среди них нет? Познакомьтесь с atomicCAS. 🔁
Сравнение и обмен
atomicCAS означает «сравнение и обмен». Операция записывает новое значение только в том случае, если текущее значение совпадает с ожидаемым, причём всё это выполняется одним атомарным шагом.
atomicCAS(addr, expected, desired);Что она возвращает
atomicCAS возвращает значение, которое фактически хранилось в ячейке. Если оно равно Вашему ожидаемому значению, обмен выполнен успешно; в противном случае кто-то другой изменил значение раньше.
Цикл повторных попыток
Основной шаблон — это цикл: прочитать текущее значение, вычислить новое, попытаться выполнить обмен и повторять эти действия, пока atomicCAS не подтвердит успех.
Цикл CAS в коде
Этот цикл повторяет попытки, пока другой поток не успеет вклиниться между Вашим чтением и записью. В этом состоит суть пользовательской атомарной операции.
do {
old = *addr;
newv = f(old);
} while (atomicCAS(addr, old, newv) != old);Создание любой операции
Подставьте любую функцию вместо f — и получите её атомарную версию. CAS позволяет создавать обновления, которые аппаратное обеспечение никогда не поставляло напрямую.
Атомарная работа с float на старом оборудовании
До появления встроенных атомарных операций для float разработчики имитировали atomicAdd для вещественных чисел, используя atomicCAS над битовым представлением с помощью приёмов __int_as_float.
Почему цикл может зациклиться
При сильной конкуренции обмен часто завершается неудачей и повторяется. Каждая неудача означает, что победил другой поток, поэтому перегруженные адреса заставляют циклы CAS работать дольше.
Прогресс гарантирован
Даже при повторных попытках алгоритм является свободным от блокировок: если обмен завершился неудачей, какой-то другой поток точно продвинулся вперёд. Система никогда не останавливается полностью.
Согласуйте разрядность
atomicCAS работает с определёнными разрядностями, например 32 и 64 битами. Приведите данные к соответствующему целочисленному типу, чтобы сравнение выполнялось над исходными битами.
Сначала выбирайте встроенные операции
Используйте встроенную атомарную операцию, если она существует: она быстрее и проще. Обращайтесь к atomicCAS только для пользовательских обновлений, которые не поддерживаются другими средствами.
Быстрая проверка
Проверьте, как Вы поняли сравнение и обмен.
Итоги: пользовательские атомарные операции
Вы узнали, что с помощью atomicCAS и цикла повторных попыток можно создать любую атомарную операцию. Такой алгоритм не использует блокировки, но при конкуренции может долго повторять попытки. ✅
Изучай C++ с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 30
- Уроки
- 120
Часто задаваемые вопросы
Урок «Пользовательские атомарные операции с atomicCAS» бесплатный?
Да — полный текст урока «Пользовательские атомарные операции с atomicCAS» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс CUDA Academy, подпишись на CoddyKit PRO. Курс CUDA Academy содержит 4 уроков всего.
Чему я научусь в уроке «Пользовательские атомарные операции с atomicCAS»?
Сравнение и обмен для произвольного обновления. Ты практикуешь CUDA Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать CUDA Academy?
Предыдущий опыт не требуется. CUDA Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Пользовательские атомарные операции с atomicCAS»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке CUDA Academy?
Да. Каждый урок CUDA Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Состояния гонки на GPU
- atomicAdd и другие операции
- Создание гистограммы
- Пользовательские атомарные операции с atomicCAS