Перекрытие передачи данных и выполнения ядра с использованием потока CUDA - PullRequest
3 голосов
/ 06 июня 2011

Я хочу оптимизировать свою программу CUDA, перекрывая передачу данных с выполнением ядра.Но пример программы asyncAPI.cu в CUDA SDK слишком прост, чтобы помочь.

Я выполнил поиск по этой проблеме и обнаружил, что в некоторых руководствах для достижения перекрытия используются два потока CUDA.В моем случае необходимо вычислить огромное количество данных, поэтому мне нужно циклически проходить и отправлять часть данных на GPU каждую итерацию.Но я не знаю, как написать такой цикл, потому что все операции асинхронные, и я боюсь, что передаваемые данные сотрут / покроют те, которые в настоящее время обрабатываются.

Кто-нибудь сталкивался с этим?
Любойпомощь будет благодарна.

1 Ответ

2 голосов
/ 06 июня 2011

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

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...