управление памятью результатов CUDA Throw::minmax_element с возвращаемым типом пара device_ptr

У меня есть облако точек в памяти устройства в 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, не загружая их в память хоста.


person Samir    schedule 16.12.2014    source источник


Ответы (1)


Минимальный и максимальный элементы, , найденные thrust::minmax_element, находятся в вашем массиве mDPointsWS ( или любой другой массив, на который указывает; вы не показали полный пример). Операция тяги нигде не перемещает данные и не сохраняет числовые минимальные/максимальные результаты. Он просто возвращает два (device_ptr) указателя (в данном случае), оба из которых фактически указывают на позиции в вашем массиве mDPointsWS или на любое другое базовое выделение массива, на которое ссылается mDPointsWS. Один указывает на положение максимального элемента в этом массиве. Другой указывает на позицию минимального элемента в этом массиве (т.е. в диапазоне offset и offset+mPointCount).

Следовательно, «время жизни» «результатов» — это просто время жизни базового массива, на который ссылается mDPointsWS (который, предположительно, вы выделили, и поэтому вы должны знать и иметь возможность контролировать его время жизни). В данном случае «хранение» «результатов» находится на графическом процессоре — прямо там, где вы поместили их в массив mDPointsWS — они никуда не переместились.

"Время жизни" указателей - это просто время жизни массива thrustAABB, который, предположительно, вы также создали, выделили и можете контролировать время жизни.

person Robert Crovella    schedule 16.12.2014
comment
Большое спасибо! Это отвечает на мой вопрос. Я не совсем ясно изложил свое дело. Я знаю, как контролировать выделение памяти dPointsWS. Меня смутило мое неправильное предположение, что тяга хранит найденные результаты где-то на GPU в каком-то дополнительном пространстве. Но на результаты указывают только возвращенные пары, и эти указатели напрямую ссылаются на элементы в dPointsWS. - person Samir; 17.12.2014