【问题标题】:memory management of results of CUDA thrust::minmax_element with pair of device_ptr return type具有一对 device_ptr 返回类型的 CUDA 推力::minmax_element 结果的内存管理
【发布时间】:2015-02-14 22:43:20
【问题描述】:

我在 dPointsWS 的设备内存中有一个点云,其内存布局首先存储所有 x 坐标,然后存储所有 y 坐标,最后存储所有 z 坐标。我使用推力来计算这个点云的紧轴对齐边界框 (AABB)。这是我的代码:

// use CUDA thrust library for AABB computation
thrust::pair<thrust::device_ptr<Real>, thrust::device_ptr<Real>> thrustAABB[3];

// do parrallel min_max reduction on GPU for each coordinate axis
thrust::device_ptr<Real> dPointsWS(mDPointsWS);
for (uint32 i = 0, offset = 0; i < 3; ++i, offset += mPointCount)
    thrustAABB[i] = thrust::minmax_element(dPointsWS + offset,
                                           dPointsWS + offset + mPointCount);
cudaDeviceSynchronize();

// get results from the GPU
for (uint32 i = 0; i < 3; ++i)
{
    mAABBWS[2 * i + 0] = *thrustAABB[i].first;
    mAABBWS[2 * i + 1] = *thrustAABB[i].second;
}

我想知道thrust::minmax_element 的结果存储在最后一个代码块之前的位置。我已经清楚地将结果下载到最后的主机内存,但我想避免这种情况。 我找到了以下文章: thrust reduction result on device memory。 但是,我的情况不同,因为我使用了返回类型thrust::pair&lt;thrust::device_ptr&lt;Real&gt;, thrust::device_ptr&lt;Real&gt;&gt;

由于归约函数返回一对device_ptrobjects,最小和最大结果应该存储在GPU上还是我误解了这一点?但如果结果存储在 GPU 上,我如何控制它们的生命周期。例如,我想直接使用OpenGL绘制AABB的结果,而不需要将它们下载到主机内存中。

【问题讨论】:

    标签: memory-management cuda thrust reduction


    【解决方案1】:

    最小元素和最大元素 found by thrust::minmax_element 驻留在您的 mDPointsWS 数组(或指向的任何数组;您没有显示完整示例)中。推力操作不会在任何地方移动任何数据或存储任何数值最小/最大结果。它只返回两个 (device_ptr) 指针(在这种情况下),这两个指针都有效地指向 mDPointsWS 数组中的位置,或者 mDPointsWS 引用的任何底层数组分配。 One 指向该数组中最大元素的位置。另一个指向该数组中最小元素的位置(即在offsetoffset+mPointCount 的范围内)。

    因此,“结果”的“生命周期”只是mDPointsWS 引用的底层数组的生命周期(大概是您分配的,因此您应该知道并能够控制它的生命周期)。在这种情况下,“结果”的“存储”在 GPU 上——就在你将它们放在 mDPointsWS 数组中的位置——它们没有移动到任何地方。

    指针的“生命周期”就是thrustAABB数组的生命周期,想必你也创建、分配并控制了它的生命周期。

    【讨论】:

    • 非常感谢!这回答了我的问题。我没有把我的案子说清楚。我知道如何控制 dPointsWS 的内存分配。我的错误假设是推力将找到的结果存储在 GPU 上某个额外空间的某个地方,这让我感到困惑。但结果仅由返回的对指向,这些指针直接引用 dPointsWS 中的元素。
    猜你喜欢
    • 2014-08-31
    • 2012-02-18
    • 1970-01-01
    • 2016-02-26
    • 2013-07-26
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多