CUDA Academy · Урок

Пользовательские атомарные операции с atomicCAS

Сравнение и обмен для произвольного обновления.

Урок 4 из 413 шагов

«Пользовательские атомарные операции с 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 — локальная установка не требуется.

Все уроки этого курса

  1. Состояния гонки на GPU
  2. atomicAdd и другие операции
  3. Создание гистограммы
  4. Пользовательские атомарные операции с atomicCAS
← Назад к CUDA Academy