我在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的结果,而不将其下载到主机内存。
答案 0 :(得分:0)
最小元素和最大元素found by thrust::minmax_element
驻留在mDPointsWS
数组中(或者指向的任何数组;您没有显示完整的示例)。推力操作不会移动任何数据或在任何地方存储任何数值最小/最大结果。它只返回两个(device_ptr
)指针(在本例中),它们都有效地指向mDPointsWS
数组中的位置,或者mDPointsWS
引用的任何基础数组分配。一个指向该数组中max元素的位置。另一个指向该数组中min元素的位置(即在offset
和offset+mPointCount
范围内)。
因此,“结果”的“生命周期”只是mDPointsWS
引用的基础数组的生命周期(可能是您分配的,因此您应该知道并能够控制其生命周期)。在这种情况下,“结果”的“存储”在GPU上 - 正好放在mDPointsWS
数组中 - 它们没有移动到任何地方。
指针的“生命周期”只是thrustAABB
数组的生命周期,大概你也创建,分配并控制了它的生命周期。