РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
718 of 769 menu

Метод wait_event

Метод wait_event класса Stream добавляет в поток ожидание указанного события. Это означает, что все последующие операции в потоке будут ждать, пока событие не будет зафиксировано. Метод принимает один обязательный параметр - объект события, созданный с помощью Event. Событие должно быть предварительно записано в каком-либо потоке с помощью метода record_event.

Синтаксис

stream.wait_event(event)

Пример

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

import torch # Создаем поток и событие stream = torch.cuda.Stream() event = torch.cuda.Event() # Запускаем операции в потоке with torch.cuda.stream(stream): t = torch.tensor([1, 2, 3, 4, 5], device='cuda') t = t * 2 # Записываем событие после операций event.record(stream) # В основном потоке ждем завершения события torch.cuda.current_stream().wait_event(event) # Теперь операции в основном потоке будут ждать событие res = torch.tensor([10, 20, 30], device='cuda') print(res)

Пример

Пример синхронизации двух потоков с помощью wait_event:

import torch torch.manual_seed(0) # Создаем два потока stream1 = torch.cuda.Stream() stream2 = torch.cuda.Stream() event = torch.cuda.Event() # Первый поток выполняет вычисления with torch.cuda.stream(stream1): t1 = torch.randn(100, 100, device='cuda') t1 = t1 * 2 event.record(stream1) # Второй поток ждет завершения первого with torch.cuda.stream(stream2): stream2.wait_event(event) t2 = torch.randn(100, 100, device='cuda') t2 = t2 + t1 # Синхронизируем все потоки torch.cuda.synchronize() print(t2.shape)

Результат выполнения кода:

torch.Size([100, 100])

Пример

Использование wait_event с несколькими событиями для сложной синхронизации:

import torch torch.manual_seed(0) # Создаем потоки и события stream_a = torch.cuda.Stream() stream_b = torch.cuda.Stream() stream_main = torch.cuda.current_stream() event_a = torch.cuda.Event() event_b = torch.cuda.Event() # Поток A вычисляет данные with torch.cuda.stream(stream_a): data_a = torch.randn(50, 50, device='cuda') data_a = data_a * 3 event_a.record(stream_a) # Поток B вычисляет другие данные with torch.cuda.stream(stream_b): data_b = torch.randn(50, 50, device='cuda') data_b = data_b + 5 event_b.record(stream_b) # Основной поток ждет оба события stream_main.wait_event(event_a) stream_main.wait_event(event_b) # Объединяем результаты result = data_a + data_b print(result.shape)

Результат выполнения кода:

torch.Size([50, 50])

Смотрите также

  • метод record_event,
    который записывает событие в поток
  • метод query,
    который проверяет статус события
  • метод synchronize,
    который блокирует выполнение до завершения всех операций в потоке
  • метод wait_stream,
    который ожидает завершения всех операций в другом потоке
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить