0

驻留扭曲的数量是否也受到用户指定的堆大小的限制?

例如,如果每个线程需要分配 1 MB 内存并且堆设置为总共 32 MB(我假设 cudaLimitMallocHeapSize 用于每次内核启动而不是每个线程的堆使用,对吗?)。设备上只允许一个扭曲是真的吗?

4

1 回答 1

1

内核启动(或warp 或块的发布)将不受堆大小的限制。相反,如果不能满足每个线程请求分配的已发布线程数(已达到每个线程 malloc,但未达到相应的空闲),内核启动将失败。您不妨参考堆内存分配部分CUDA C 程序员指南。该部分给出了每个线程分配的示例代码,您可以轻松地修改该代码以向自己证明这种行为。只需调整堆大小和启动的线程(或块)数量即可查看达到堆限制时的行为。是的,cudaLimitMallocHeapSize 实际上用于整个设备上下文,因此它适用于在相关调用 cudaDeviceSetLimit() 之后的所有内核启动。这不是每个线程的限制。另请注意,存在一些分配开销。将堆大小设置为 128MB 并不意味着所有 128MB 都可用于后续设备 malloc 操作。提到设备 malloc 操作只能在 CC 2.0 及更高版本上可能也很有用。

于 2012-10-31T03:31:08.083 回答