Memory management CUDA推力结果的内存管理::具有设备对ptr返回类型的minmax_元素

Memory management CUDA推力结果的内存管理::具有设备对ptr返回类型的minmax_元素,memory-management,cuda,thrust,reduction,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 parr

我在设备内存中的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;
}
我想知道的是,在最后一个代码块之前,推力::minmax_元素的结果存储在哪里。最后,我已将结果下载到主机内存中,但我希望避免这种情况。 我发现了以下文章: . 但是,我的情况不同,因为我使用返回类型推力::对


当reduce函数返回一对设备对象时,最小和最大结果应该存储在GPU上,还是我误解了这一点?但是如果结果存储在GPU上,我如何控制它们的生存期呢。例如,我希望使用OpenGL直接使用AABB绘图的结果,而无需将其下载到主机内存。

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

因此,结果的生存期就是mDPointsWS引用的底层数组的生存期,而mDPointsWS可能是您分配的,因此您应该知道并能够控制它的生存期。在这种情况下,结果存储在GPU上——就在您将它们放入mDPointsWS数组的地方——它们没有移动到任何地方


指针的生存期正好是PushTorAABB数组的生存期,据推测,您还创建、分配了该数组,并可以控制其生存期。

非常感谢!这回答了我的问题。我没有把我的理由说清楚。我知道如何控制dPointsWS的内存分配。我错误地认为,推力将发现的结果存储在GPU的某个额外空间中,这让我感到困惑。但是结果只由返回的对指向,这些指针直接引用dPointsWS中的元素。