【问题标题】:Thrust: sort_by_key slow due to memory allocation推力:由于内存分配,sort_by_key 缓慢
【发布时间】:2011-09-30 03:14:08
【问题描述】:

我正在使用大小为 8000 万的键值 int 数组进行 sort_by_key。 该设备是具有 2GB VRAM 的 GTX 560 Ti。可用时(免费) sort_by_key 之前的内存是1200MB,它在200ms 中完成排序。 但是,当可用内存下降到600MB 时, 相同的键值数组采用1.5-3s!

我在 Compute Visual Profiler 下运行该程序。我发现GPU 时间戳在sort_by_key 之前的最后一个内核之间跳跃 1.5-3s 以及sort_by_key 中的第一个内核调用(这是一个 RakingReduction)。

我怀疑在sort_by_key 内部进行了内存分配, 在它调用它的第一个内部内核之前。 sort_by_key的记忆 需求可用(即使可用内存为600MB),因为 sort_by_key 有效,即使它速度较慢。我看到电脑 发生这种情况时冻结 1 秒。我还看到 CPU 有一个凸起 物理内存图表,如果我保持 Process Explorer 打开。

我能做些什么来让sort_by_key 工作得一样快吗 什么时候可用内存较少?此外,两者之间发生了什么 导致内存碰撞和临时的设备和主机 结冰?

【问题讨论】:

    标签: sorting slowdown thrust


    【解决方案1】:

    thrust::sort_by_key 确实分配了 O(N) 的临时空间——当基数排序大于单个多处理器可以完成时,它不是就地排序。因此,输入数据至少需要 80M * 2 * sizeof(int) = 640MB,加上临时空间,这种排序至少需要 320MB。我不确定为什么当你没有足够的内存时排序不会失败——也许 600 MB 是一个较低的估计值,或者推力正在回落到 CPU 执行(我怀疑它会这样做)。

    关于性能下降的另一个想法是,当您需要几乎所有可用内存时,驱动程序/运行时必须按顺序处理可用内存中的一些碎片分配这么大的数组,造成额外的开销。

    顺便说一句,你如何测量可用内存?

    【讨论】:

    • 哈里斯:谢谢!我使用 cudaMemGetInfo() 测量可用内存。我很确定 Thrust 不会依赖 CPU。但是,根据 Jared Hoberock (NVIDIA) 的说法,这可能是由于 Windows 上的 CUDA 驱动程序存在问题:groups.google.com/forum/#!topic/thrust-users/nXQD6j7_xfs
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 2015-09-06
    • 2013-07-26
    • 2012-05-07
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多