Как я могу реализовать механизм вращения вращения в форме
while(variable == 0);
где переменная обновляется до 1 другим потоком CUDA после некоторого события.
Я пытался написать это, как описано выше, но код, похоже, просто игнорируется, и вызывающий поток просто проходит мимо него, не ожидая вообще. Я абсолютно уверен, что значение равно 0, но поток не ждет вообще.
Также, если я напишу:
while(variable == 0) __threadfence();
Чтобы не рисковать кэшированием переменной, поток блокируется на неопределенный срок, даже если переменная в конечном итоге будет установлена в 1.
Это все очень странное поведение для меня, поскольку репликация этого кода на процессоре приводит к правильному поведению.
Редактировать: Как ни странно, это, кажется, работает правильно, если у меня есть блоки по 1 потоку каждый, но не, если у меня есть несколько потоков в одном блоке. Таким образом, потоки из одного блока могут видеть записи, выполненные потоками из других блоков, но не записи, выполненные потоками из того же блока. Странно ...