我正在编写一个服务器进程,使用cuda在GPU上执行计算.我想排队进来的请求,直到设备上有足够的内存来运行作业,但是我很难确定我可以在设备上分配多少内存.我对工作需要多少内存有一个非常好的估计(至少从cudaMalloc()分配多少),但是在我分配了可用的全局内存总量之前很久就让设备内存不足.
是否有一些公式王从全局总记忆中计算出我可以分配的金额?我可以玩它,直到我得到一个经验有效的估计,但我担心我的客户会在某些时候部署不同的卡,我的偷工减料的数字不会很好.
GPU的DRAM大小是您可以分配的内存量的上限cudaMalloc,但不能保证CUDA运行时可以在单个大型分配中满足对所有内存的请求,甚至不能保证一系列小分配.
内存分配的约束因操作系统的底层驱动程序模型的细节而异.例如,如果所讨论的GPU是主显示设备,则OS可能还保留了GPU的一些内存用于图形.运行时使用的其他隐式状态(例如堆)也会占用内存资源.内存也可能变得碎片化,并且没有足够大的连续块来满足请求.
CUDART API函数cudaMemGetInfo报告可用的可用内存量和总量.据我所知,没有类似的API调用可以报告最大可满足分配请求的大小.