Доступна ли память, использующая malloc внутри ядра, потоками других блоков? - PullRequest
1 голос
/ 12 октября 2019

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

1 Ответ

4 голосов
/ 12 октября 2019

Да, эта память поступает из так называемой «кучи устройства» и доступна любому коду устройства (любому потоку) из любого ядра, работающего на этом графическом процессоре.

Обратите внимание, что это относится даже к ядрамкроме той, которая фактически выполняла операцию malloc.

Вышеприведенный оператор применяется до завершения работы приложения или до тех пор, пока вы явно не освободите эту память, используя внутренний указатель free() для указателя.

Вы можете прочитать документацию о функциональности ядра malloc(). Существуют ограничения по размеру, которые вы можете изменить, и это хорошая практика, если у вас возникают проблемы с таким кодом, проверять указатель возврата на NULL после этого вызова malloc(). Если это NULL, то это метод API для сообщения об ошибке (обычно это означает, что вы исчерпали пространство выделения в «куче устройств»).

Указатель, выделенный таким образом , не может участвовать (использовать в) любой хост-API для перемещения данных, например cudaMemcpy. Он доступен / доступен только из кода устройства.

Также обратите внимание, что операция malloc(), как и большинство кодов устройства, которые вы пишете, выполняется для каждого потока . Каждый поток, который выполняет вызов malloc(), будет делать это независимо, и каждый поток (при условии отсутствия сбоев) получит отдельный указатель на отдельное выделение. Однако все такие указатели впоследствии могут использоваться любым кодом, работающим на этом устройстве, пока они не будут явно освобождены.

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