Трехмерная кривая Гильберта для разреженной геометрии

У меня есть трехмерный массив, содержащий некубическую ограничивающую рамку разреженной геометрии.

Массив геометрии[x][y][z] содержит значение 0, если (x,y,z) является частью вычислительной области, и 1 в противном случае.

Пытаясь изменить порядок вычислений, я хотел бы пройти это пространство, используя кривую Гильберта.

Контекст оптимизирует глобальный доступ к памяти в программе графического процессора с привязкой к памяти.

Как я могу реализовать это?

Обновление: я просто хочу просмотреть непустые ячейки, так как я буду хранить только их (в массиве) вместе со списком смежности, который отслеживает 19 соседних узлов элемента.

Вычисление заключается в простом копировании между двумя массивами:

dst[i] = src[adjacency_map[i]]

Это фаза распространения метода разреженных решеток Больцмана, где физическая интерпретация заключается в потоке «жидких частиц» из соседнего места.

Чем более последовательны значения в adjacency_map; тем больше обращений к объединенной памяти мы надеемся получить.

Ядро OpenCL:

__kernel void propagation(__global double *dst, __global double *source,
                          __global const int *adjacency_map, const uint max_size)
{
    size_t l = get_global_id(0);

    if( l > max_size ) 
        return;

    dst[l] = src[adjacency_map[l]];
}

person kyrre    schedule 30.07.2011    source источник
comment
Вы хотите просмотреть все ячейки тома или только непустые ячейки? Какие вычисления вы хотите применить к ячейкам?   -  person Jared Hoberock    schedule 02.08.2011
comment
я хочу пройти только по непустым ячейкам, так как позже они будут сохранены в массиве. Я обновил исходный вопрос, добавив дополнительную информацию.   -  person kyrre    schedule 02.08.2011


Ответы (2)


Кривая Гильберта была бы сложной задачей. Кажется трудным найти формулировку, которая позволила бы случайный доступ к индексам точек на кривой.

Однако порядок Мортона был бы разумен и имеет некоторые из тех же замечательных свойств, что и это также кривая, заполняющая пространство. Существует также процедура случайного доступа для нахождения числа Мортона N-мерной точки.

То, что вы можете рассмотреть, представляет собой двухэтапный процесс:

  1. Примените шаг сжатия потока к вашим данным, чтобы выбрать элементы объема, которые вы хотите обработать.

  2. Отсортируйте эти сжатые данные, используя их индексы Мортона в качестве ключа сортировки.

Вы можете использовать thrust как для сжатия потока, так и для сортировки ключ-значение.

Это должно создать список элементов тома в порядке, который способствует непрерывности. Тем не менее, накладные расходы на реорганизацию данных могут преобладать над стоимостью исходного нерегулярного доступа.

person Jared Hoberock    schedule 02.08.2011

Это звучит совершенно невозможно.

Вы уже исключили kdtree или octree?

Описания kdtree (глава 21.2) и octree (глава 21.8) в числовых рецептах вполне понятны: http://apps.nrbook.com/rollover/index.html

person whoplisp    schedule 31.07.2011