在内核中使用 malloc 分配的内存是否可由其他块的线程访问?



如果一个线程在内核中使用malloc调用分配全局内存,则该内存是否也可以被其他块的线程访问。

是的,此内存来自所谓的"设备堆",并且可以通过该GPU上运行的任何内核的任何设备代码(任何线程(访问它。

请注意,这甚至适用于实际执行malloc操作的内核以外的内核。

上述语句一直适用,直到应用程序终止,或者直到您使用内核内free()指针调用显式释放该内存。

您可能希望阅读有关内核内malloc()功能的文档。 您可以修改大小限制,如果您在使用此类代码时遇到问题,最好在调用后检查返回指针的 NULL,malloc()。 如果为 NULL,则这是发出错误信号的 API 方法(通常意味着"设备堆"上的分配空间不足(。

以这种方式分配的指针不能参与(用于(任何用于数据移动的主机 API,例如cudaMemcpy。 它只能从设备代码中使用/访问。

另请注意,与编写的大多数设备代码一样,malloc()操作是按线程执行的。 执行malloc()调用的每个线程将独立执行此操作,并且每个线程(假设没有失败(将接收一个单独的指针,指向单独的分配。 但是,所有这些指针随后都可以由该设备上运行的任何代码使用,直到它们被显式释放。

最新更新