Занятое вращение в CUDA - PullRequest
       23

Занятое вращение в CUDA

3 голосов
/ 13 октября 2011

Как я могу реализовать механизм вращения вращения в форме

while(variable == 0);

где переменная обновляется до 1 другим потоком CUDA после некоторого события.

Я пытался написать это, как описано выше, но код, похоже, просто игнорируется, и вызывающий поток просто проходит мимо него, не ожидая вообще. Я абсолютно уверен, что значение равно 0, но поток не ждет вообще. Также, если я напишу:

while(variable == 0) __threadfence();

Чтобы не рисковать кэшированием переменной, поток блокируется на неопределенный срок, даже если переменная в конечном итоге будет установлена ​​в 1. Это все очень странное поведение для меня, поскольку репликация этого кода на процессоре приводит к правильному поведению.

Редактировать: Как ни странно, это, кажется, работает правильно, если у меня есть блоки по 1 потоку каждый, но не, если у меня есть несколько потоков в одном блоке. Таким образом, потоки из одного блока могут видеть записи, выполненные потоками из других блоков, но не записи, выполненные потоками из того же блока. Странно ...

1 Ответ

8 голосов
/ 14 октября 2011

Занятое вращение требует большого внимания, и вы должны быть очень осторожны с этим!

Вы должны иметь в виду, что 32 нити, образующие основу, работают в идеальной синхронизации.Если вы сталкиваетесь с веткой, потоки, не принимающие ее, становятся отключенными, пока потоки, выполняющие ветку, не выходят из нее.Вот почему попытка вращения вращения в деформации может привести к тупиковой ситуации: 31 поток будет постоянно ждать, пока один отключенный поток выполнит свою работу.

Во-вторых, если вы попытаетесь синхронизировать блоки, вы должны знать, что оба блока работают параллельно.Теоретически, вы не знаете, сколько блоков работает;на практике вы можете прочитать спецификации вашего графического процессора и запустить столько, сколько он может обработать (в драйвере и / или оборудовании есть некоторые ошибки, которые могут также вызвать некоторые проблемы)

В-третьих, у вас естьпомнить, что компилятор CUDA пытается оптимизировать.Вы должны установить вашу общую или глобальную переменную как 'volatile', чтобы гарантировать, что она всегда читается.

...