Как развернуть быстрое представление BVH в Haskell

Я играю с трассировщиком лучей Haskell и в настоящее время использую реализацию BVH, которая подчеркивает простое двоичное дерево для хранения иерархии,

data TreeBvh
   = Node Dimension TreeBvh TreeBvh AABB
   | Leaf AnyPrim AABB

где Размерность либо X , Y или Z (используется для более быстрого обхода), а AABB - это мой тип ограничивающей рамки, выровненной по оси. Это работает достаточно хорошо, но я Я действительно хотел бы получить это как можно быстрее. Итак, моим следующим шагом (при использовании C / C ++) будет использование этого дерева для построения плоского представления, в котором узлы хранятся в массиве, «левый» дочерний элемент сразу следует за родительским узлом и индексом правого дочернего элемента родительского хранится вместе с родителем, поэтому у меня есть что-то вроде этого:

data LinearNode
   = LinearNode Dimension Int AABB
   | LinearLeaf AnyPrim AABB

data LinearBvh
   = MkLinearBvh (Array Int LinearNode)

Я еще не пробовал это, но боюсь, что производительность все равно будет ниже номинальной, потому что я не могу сохранить LinearNode в UArray, я также не мог сохранить Int , индексирующий правильный дочерний элемент, вместе со значениями Float , которые составляют AABB в одном UArray (поправьте меня, если я ошибся ). А использование двух массивов будет означать плохую когерентность кеша. Так что я' m в основном ищет способ эффективно хранить свое дерево, чтобы я мог ожидать хорошей производительности при обходе. Это могло бы быть

  • компактным
  • иметь хорошие свойства локальности
  • работа с недавними компиляторами GHC
  • должна проходить как можно меньше косвенных обращений (хотя «преобразователь» не может помочь в производительности, поэтому «распакованный» типы могут помочь, я думаю)
14
задан Josh Lee 22 February 2011 в 14:22
поделиться