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

时间:2019-10-12 17:39:16

标签: cuda

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

1 个答案:

答案 0 :(得分:4)

是的,该内存来自所谓的“设备堆”,并且可以由该GPU上运行的任何内核的任何设备代码(任何线程)访问。

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

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

您可能希望阅读the documentation关于内核malloc()的功能。您可以修改大小限制,如果在使用此类代码时遇到麻烦,可以修改大小限制,以确保在malloc()调用之后检查返回指针是否为NULL。如果为NULL,则是用于指示错误的API方法(通常意味着您用完了“设备堆”上的分配空间)。

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

还要注意,malloc()操作与您编写的大多数设备代码一样,是按线程执行的。每个执行malloc()调用的线程将独立执行此操作,并且每个线程(假定没有失败)将收到一个指向单独分配的单独指针。但是,所有此类指针随后均可在该设备上运行的任何代码中使用,直到将其明确释放为止。