2

我有 3 种不同的基于推力的实现来执行某些计算:第一个是最慢的,需要最少的 GPU 内存,第二个是最快的,需要最多的 GPU 内存,第三个介于两者之间。对于其中的每一个,我都知道使用的每个设备向量的大小和数据类型,因此我使用 vector.size()*sizeof(type) 来粗略估计存储所需的内存。

所以对于给定的输入,根据它的大小,我想决定使用哪个实现。换句话说,确定适合的最快实现是在可用的 GPU 内存中。

我认为对于我正在处理的非常长的向量,我正在计算的 vector.data() 的大小是一个相当好的估计,其余的开销(如果有的话)可以忽略不计。

但是我如何估计与推力算法实现相关的内存使用开销(如果有的话)?具体来说,我正在寻找有关转换、复制、减少、reduce_by_key 和收集的此类估计。我并不真正关心静态开销,并且不是算法输入和输出参数大小的函数,除非它非常重要。

我理解 GPU 内存碎片等的含义,但让我们暂时搁置一下。

非常感谢您花时间研究这个问题。

4

1 回答 1

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呼叫的一些具体示例。

使用经过适当检测的分配器并在一些不同的问题大小下运行它,您应该能够拟合上面的模型并估计b给定算法的值。然后可以在您的代码中使用该模型来确定给定内存的安全最大问题大小。

我希望这是你问的...

于 2012-06-11T12:05:52.720 回答