Доступ к памяти устройства cuda во время работы ядра cuda

Я выделил память на устройстве с помощью cudaMalloc и передал ее функции ядра. Можно ли получить доступ к этой памяти с хоста до того, как ядро завершит свое выполнение?

 talonmies13 июн. 2012 г., 05:34
Нет, это неопределенное поведение в модели памяти CUDA.

Ответы на вопрос(4)

пока ядро все еще выполняется, - отправить асинхронный memcpy в поток, отличный от ядра. (Если вы используете API по умолчанию для запуска ядра или асинхронного memcpy, поток NULL заставит две операции быть сериализованными.)

Но поскольку нет способа синхронизировать выполнение ядра с потоком, этот код будет зависеть от состояния гонки. т.е. механизм копирования может извлекать память, которая еще не была записана ядром.

Человек, который ссылается на сопоставленную закрепленную память, находится в чем-то: если ядро пишет в сопоставленную закрепленную память, оно эффективно «копирует» данные в память хоста, когда он заканчивает обработку. Эта идиома работает хорошо, при условии, что ядро больше не будет касаться данных.

независимо от того, работает ядро или нет.

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

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

Обновить:

Исходя из вашего пояснения, я думаю, что самое близкое, что вы можете получить, - это использование отображенной памяти хоста с блокировкой страницы, также называемой нулевой копией памяти. При таком подходе значения копируются на хост по мере их записи ядром. Нет способа запросить ядро, чтобы увидеть, сколько работы оно выполнило, поэтому я думаю, что вам придется многократно сканировать память на предмет новых записанных значений. См. Раздел 3.2.4.3, Mapped Memory, в Руководстве по программированию CUDA v4.2 для получения дополнительной информации.

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

 gsm198613 июн. 2012 г., 04:52
извините, если я не задал вопрос четко. Под доступом к памяти графического процессора я имею в виду cudaMemcpy. Здесь я использую массив, поэтому, если графический процессор заполнил местоположение '0'. и теперь он работает с местоположением «1», есть ли способ, которым я могу сделать cudaMemcpy содержимого в 0-м месте на ЦП до того, как ядро завершит свое выполнение?

это асинхронный (не блокирующий) вызов. Следующий вызов cudaMemcpy будет блокировать до тех пор, пока ядро не завершит работу.

Если вы хотите получить результат для целей отладки, возможно, вы можете использовать cudaDebugging, где вы можете пройтись по ядру и проверить память.

Для небольших проверок результатов вы также можете использовать printf () в коде ядра.

Или запустите только блок потоков размером (1,1), если вы заинтересованы в этом конкретном результате.

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

То, что вы пытаетесь достичь, - это перекрывать передачу и выполнение данных. благодаря использованию потоков. Вы создаете несколько потоков CUDA и ставите в очередь выполнение ядра и cudaMemcpy от устройства к хосту в каждом потоке. Например, поместите ядро, которое заполняет местоположение "0" и cudaMemcpy из этого местоположения обратно на хост в поток 0, ядро, которое заполняет местоположение "1". и cudaMemcpy от "1"; в поток 1 и т. д. Что произойдет, так это то, что графический процессор будет дублировать копирование из & quot; 0 & quot; и выполнение "1". Проверьте документацию CUDA, она где-то задокументирована (я думаю, в руководстве по передовому опыту).

Ваш ответ на вопрос