У меня есть 3d-массив, содержащий не кубическую ограничивающую рамку с разреженной геометрией.
Геометрия массива [x] [y] [z] содержит значение 0, если (x, y, z) является частью вычислительной области, а в противном случае 1.
Пытаясь изменить порядок вычислений, я хотел бы обойти это пространство, используя кривую Гильберта.
Контекст оптимизирует глобальный доступ к памяти в связанной с памятью программе GPU.
Как я могу это реализовать?
Обновление :
Я просто хочу пройти через непустые ячейки, так как я буду хранить только те (в массиве) вместе со списком смежности, который отслеживает 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]];
}