Aula 22: Condições de Corrida na Memória Global — Por Que Atomics
Até agora, quase todo kernel que você escreveu dava a cada thread o seu PRÓPRIO slot de saída: c[i] = a[i] + b[i], onde a thread i é a única que jamais toca c[i]. Como nenhuma dupla de threads compartilha um destino, a ordem em que elas rodam não importa — o resultado é sempre correto. Mas alguns pr
Imagine 30 crianças compartilhando uma única folha de contagem que marca 5. Duas olham para ela ao mesmo tempo, ambas veem 5, ambas escrevem 6 — e uma contagem desaparece. Uma operação atômica é uma regra em que apenas uma criança segura o lápis por vez (ler, somar, escrever), então nenhuma contagem nunca se perde.
- condição de corrida (race condition)
- Um bug em que o resultado depende do timing e da ordem imprevisíveis em que as threads tocam os mesmos dados — pode funcionar em uma execução e falhar na seguinte.
- leitura-modificação-escrita (read-modify-write)
- x++ na verdade são três passos — ler x, somar 1, e escrever x. Outra thread pode se intrometer entre esses passos.
- atualização perdida (lost update)
- Duas threads leem o mesmo valor antigo e ambas escrevem de volta, então um dos incrementos simplesmente desaparece e a contagem sai baixa demais.
- operação atômica (atomic operation)
- Um read-modify-write indivisível que nenhuma outra thread pode interromper — a solução para uma corrida, por exemplo atomicAdd.