我有 3 种不同的基于推力的实现来执行某些计算:第一个是最慢的,需要最少的 GPU 内存,第二个是最快的,需要最多的 GPU 内存,第三个是介于两者之间。对于每一个,我知道所使用的每个设备向量的大小和数据类型,因此我使用 vector.size()*sizeof(type) 来粗略估计存储所需的内存。
因此,对于给定的输入,根据其大小,我想决定使用哪种实现。换句话说,确定可用 GPU 内存中适合的最快实现。
我认为,对于我正在处理的很长的向量,我正在计算的 vector.data() 的大小是一个相当好的估计,其余的开销(如果有)可以忽略不计。
但是我如何估计与推力算法实现相关的内存使用开销(如果有)?具体来说,我正在寻找对转换、复制、减少、减少键和聚集的估计。我并不真正关心静态开销,并且不是算法输入和输出参数大小的函数,除非它非常重要。
我理解 GPU 内存碎片等的含义,但我们暂时先把这个放在一边。
非常感谢您花时间调查此问题。
最佳答案
Thrust 旨在像黑匣子一样使用,并且没有关于我所知道的各种算法的内存开销的文档。但通过进行一些数值实验来凭经验推导它听起来并不是一个非常困难的问题。您可能预计特定算法的内存消耗近似为:
total number of words of memory consumed = a + (1 + b)*N
针对 N
个输入单词的问题。这里,a
是算法的固定开销,1+b
是最佳拟合内存与 N
行的斜率。 b
是每个输入单词的算法开销量。
所以问题就变成了如何监控给定算法的内存使用情况。 Thrust 使用内部辅助函数 get_temporary_buffer
来分配内部内存。最好的想法是编写您自己的 get_temporary_buffer
实现,它会发出调用它的大小,并且(可能)使用对 cudaGetMemInfo
的调用来获取上下文内存统计信息函数被调用的时间。您可以查看一些如何拦截 get_temporary_buffer
调用的具体示例 here .
使用适当的分配器并在几个不同的问题规模上运行一些分配器,您应该能够拟合上面的模型并估计给定算法的 b
值。然后可以在代码中使用该模型来确定给定内存的安全最大问题大小。
我希望这就是您要问的问题......
关于cuda - 如何估计基于推力的实现的 GPU 内存需求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10979229/