CUDA thrust :: minmax_element结果的内存管理,带有一对device_ptr返回类型

时间:2014-12-16 15:11:16

标签: memory-management cuda thrust reduction

我在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<thrust::device_ptr<Real>, thrust::device_ptr<Real>>

当缩减函数返回一对device_ptr个对象时,最小和最大结果应该存储在GPU上还是我误解了这个?但如果结果存储在GPU上,我该如何控制它们的生命周期。例如,我想直接使用OpenGL绘制AABB的结果,而不将其下载到主机内存。

1 个答案:

答案 0 :(得分:0)

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

因此,“结果”的“生命周期”只是mDPointsWS引用的基础数组的生命周期(可能是您分配的,因此您应该知道并能够控制其生命周期)。在这种情况下,“结果”的“存储”在GPU上 - 正好放在mDPointsWS数组中 - 它们没有移动到任何地方。

指针的“生命周期”只是thrustAABB数组的生命周期,大概你也创建,分配并控制了它的生命周期。