我有3种不同的基于推力的实现,可以执行某些计算:第一种是最慢的,需要最少的GPU内存,第二种是最快的,需要大部分GPU内存,第三种是介于两者之间。对于每一个我知道每个设备向量的大小和数据类型,所以我使用vector.size()* sizeof(类型)粗略估计存储所需的内存。
因此,对于给定的输入,根据其大小,我想决定使用哪种实现。换句话说,确定最适合的实现是在可用的GPU内存中。
我认为对于我正在处理的很长的向量,我正在计算的vector.data()的大小是一个相当不错的估计,其余的开销(如果有的话)可以被忽略。
但是,我如何估计与推力算法实现相关的内存使用开销(如果有的话)?具体来说,我正在寻找变换,复制,减少,reduce_by_key和聚集的估计。我并不真正关心静态的开销,它不是算法输入和输出参数大小的函数,除非它非常重要。
我理解GPU内存碎片等的含义,但让我们暂时搁置一下。
非常感谢你花时间研究这个问题。
答案 0 :(得分:2)
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
值。然后,可以在代码中使用该模型来确定给定内存的安全最大问题大小。
我希望这就是你所要求的......