У меня есть облако точек в памяти устройства в 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::pair<thrust::device_ptr<Real>, thrust::device_ptr<Real>>
.
Поскольку функция редукции возвращает пару device_ptr
объектов, минимальный и максимальный результаты должны храниться на GPU или я неправильно понимаю? Но если результаты хранятся на GPU, как я могу контролировать их время жизни. Например, я хотел бы напрямую использовать результаты для рисования AABB с помощью OpenGL, не загружая их в память хоста.