Вопрос

У меня проблема, которая, по-видимому, решается путем перечисления всех возможных решений, а затем нахождение лучшего. Чтобы сделать это, я разработал алгоритм обратной передачи, который перечисляет и хранит лучшее решение, если найдено. До сих пор это работает нормально.

Теперь я хотел портировать этот алгоритм Куда. Следовательно, я создал процедуру, которая генерирует некоторые различные основные случаи. Эти основные случаи следует обрабатывать параллельно на графическом процессе. Если один из куд-потоков находит оптимальное решение, все другие потоки могут - конечно - останавливать их работу.

Итак, я хотел вроде следующего: нить, которая находит оптимальное решение, должно остановиться все Бег куда-нити моей программы, тем самым отдел расчет.

После некоторых быстрых поисков я обнаружил, что потоки могут сообщать только, если они находятся в одном блоке. (Итак, я полагаю, что невозможно остановить других блокировать нити.)

Единственный метод, который я мог бы подумать, это то, что у меня есть выделенный флаг optimum_found, который проверяется в начале каждого ядра. Если найден оптимальное решение, этот флаг установлен на 1, Так что все будущие потоки знают, что им не нужно работать. Но, конечно, нити уже работают, не замечают этот флаг, если они не проверяют его на каждой итерации.

Итак, есть ли возможность остановить все оставшиеся куда-темы?

Это было полезно?

Решение

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

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

Тем не менее, я честно уверен, что нет CUDA CALL, который может убить других активно выполнять нити.

Другие советы

Я думаю, что IAN имеет правильную идею здесь. Оптимальная производительность придет от минимальной передачи памяти и ветвления. Писать в глобальную память и проверку флагов (ветвление) идет против Руководство по лучшим практикам CUDA и уменьшит ваше ускорение.

Возможно, вы захотите посмотреть обратные вызовы. Основная нить CPU может убедиться, что все потоки выполняются в правильном порядке. Темы обратного вызова CPU (чтение: постобработка) может выполнять дополнительные накладные расходы и вызывать связанные функции API, а также утилизируя все данные по потокам ... Эта функция найдена в образцах CUDA и компилирует на способность CUDA 2. Надеюсь, что это поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top