Метод synchronize
Метод synchronize класса Event
блокирует текущий поток выполнения до тех пор,
пока событие не будет зафиксировано в потоке
CUDA с помощью метода record.
Этот метод полезен для синхронизации вычислений
между разными потоками CUDA или для ожидания
завершения асинхронных операций.
Метод не принимает никаких параметров и
возвращает None. При вызове текущий
поток блокируется до тех пор, пока событие не
будет зафиксировано в потоке, с которым оно
связано.
Синтаксис
event.synchronize()
Пример
Давайте создадим событие, зафиксируем его после выполнения операции на GPU и синхронизируем поток выполнения:
import torch
torch.manual_seed(0)
# Создаём событие
event = torch.cuda.Event()
# Создаём тензор на GPU
t = torch.tensor([1, 2, 3, 4, 5]).cuda()
# Выполняем операцию на GPU
t = t * 2
# Записываем событие в поток CUDA
event.record(torch.cuda.current_stream())
# Синхронизируем поток
event.synchronize()
print(t.cpu())
Результат выполнения кода:
tensor([ 2, 4, 6, 8, 10])
Пример
Давайте используем метод synchronize для
ожидания завершения асинхронных операций в
разных потоках CUDA:
import torch
torch.manual_seed(0)
# Создаём событие и поток
event = torch.cuda.Event()
stream = torch.cuda.Stream()
# Создаём тензоры на GPU
t1 = torch.tensor([1, 2, 3, 4, 5]).cuda()
t2 = torch.tensor([5, 4, 3, 2, 1]).cuda()
# Выполняем операции в другом потоке
with torch.cuda.stream(stream):
t1 = t1 + t2
event.record(stream)
# Синхронизируем поток с событием
event.synchronize()
print(t1.cpu())
Результат выполнения кода:
tensor([6, 6, 6, 6, 6])
Пример
Давайте проверим состояние события с помощью
метода query до и после синхронизации:
import torch
torch.manual_seed(0)
# Создаём событие и поток
event = torch.cuda.Event()
stream = torch.cuda.Stream()
# Создаём тензор на GPU
t = torch.tensor([1, 2, 3, 4, 5]).cuda()
# Выполняем операцию в другом потоке
with torch.cuda.stream(stream):
t = t * 3
event.record(stream)
# Проверяем состояние события
print("До синхронизации:", event.query())
# Синхронизируемся с событием
event.synchronize()
# Проверяем состояние события после синхронизации
print("После синхронизации:", event.query())
print(t.cpu())
Результат выполнения кода:
До синхронизации: False
После синхронизации: True
tensor([ 3, 6, 9, 12, 15])
Смотрите также
-
метод
record,
который записывает событие в поток CUDA -
метод
wait,
который заставляет поток ожидать событие -
метод
query,
который проверяет состояние события -
метод
elapsed_time,
который вычисляет время между двумя событиями