如果一个线程使用内核内部的malloc调用分配全局内存,那么该内存是否也可以被其他块的线程访问。
答案 0 :(得分:4)
是的,该内存来自所谓的“设备堆”,并且可以由该GPU上运行的任何内核的任何设备代码(任何线程)访问。
请注意,这甚至适用于除实际执行malloc
操作的内核以外的其他内核。
以上语句在应用程序终止之前适用,或者直到您使用指针上的内核free()
调用显式释放该内存为止。
您可能希望阅读the documentation关于内核malloc()
的功能。您可以修改大小限制,如果在使用此类代码时遇到麻烦,可以修改大小限制,以确保在malloc()
调用之后检查返回指针是否为NULL。如果为NULL,则是用于指示错误的API方法(通常意味着您用完了“设备堆”上的分配空间)。
以这种方式分配的指针不能参与(用于)任何用于数据移动的主机API,例如cudaMemcpy
。只能通过设备代码使用/访问。
还要注意,malloc()
操作与您编写的大多数设备代码一样,是按线程执行的。每个执行malloc()
调用的线程将独立执行此操作,并且每个线程(假定没有失败)将收到一个指向单独分配的单独指针。但是,所有此类指针随后均可在该设备上运行的任何代码中使用,直到将其明确释放为止。