Почти везде, где я читал о программировании с CUDA, есть упоминание о важности того, что все нити в warp делают то же самое.
В моем коде у меня есть ситуация, когда я не могу избежать определенного состояния. Это выглядит так:
// some math code, calculating d1, d2
if (d1 < 0.5)
{
buffer[x1] += 1; // buffer is in the global memory
}
if (d2 < 0.5)
{
buffer[x2] += 1;
}
// some more math code.
Некоторые из потоков могут входить в один для условий, некоторые могут входить в оба, и другие могут не входить в них.
Теперь для того, чтобы все потоки снова вернулись к тому, чтобы "делать то же самое" после условий, следует ли их синхронизировать после условий с помощью __syncthreads()
? Или это как-то происходит автоматически?
Могут ли две нити не делать то же самое, потому что одна из них - одна операция позади, таким образом разрушая ее для всех? Или есть некоторые за кулисами попытки заставить их сделать то же самое снова после ветки?