У меня есть трехмерный массив, содержащий некубическую ограничивающую рамку разреженной геометрии.
Массив геометрии[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]];
}