Ответ 1
Если я правильно понял, вы хотите распаковать массивы пользовательских типов? если это так, зарегистрируйте векторный пакет, который также поддерживает слияние фейдов. Стоит проверить слайды для высокопроизводительного Haskell
Я играю с Haskell Raytracer и в настоящее время использую реализацию BVH, которая подчеркивает наивное двоичное дерево для хранения иерархии,
data TreeBvh
= Node Dimension TreeBvh TreeBvh AABB
| Leaf AnyPrim AABB
где Dimension - это X
, Y
или Z
(используется для более быстрого обхода), а AABB - мой тип для ограничивающего по оси рамки. Это работает достаточно хорошо, но я бы очень хотел получить это так быстро, как только возможно. Поэтому мой следующий шаг (при использовании C/С++) заключается в том, чтобы использовать это дерево для построения сглаженного представления, где узлы хранятся в массиве, "левый" ребенок сразу же следует за родителем node, а индекс правого ребенка родительский хранится с родителем, поэтому у меня есть что-то вроде этого:
data LinearNode
= LinearNode Dimension Int AABB
| LinearLeaf AnyPrim AABB
data LinearBvh
= MkLinearBvh (Array Int LinearNode)
Я еще не пробовал это, но я боюсь, что производительность все равно будет sub-par, потому что я не могу хранить экземпляры LinearNode
в UArray, и я не мог бы сохранить индексирование Int
справа ребенок вместе со значениями Float
, которые составляют AABB в одном UArray (исправьте меня, если я ошибаюсь). И использование двух массивов будет означать плохую когерентность кэша. Поэтому я в основном ищу способ эффективно хранить свое дерево, чтобы я мог ожидать хорошей производительности для обхода. Это может быть
Если я правильно понял, вы хотите распаковать массивы пользовательских типов? если это так, зарегистрируйте векторный пакет, который также поддерживает слияние фейдов. Стоит проверить слайды для высокопроизводительного Haskell
Я действительно должен отметить, что Haskell не очень хорошо дает программисту средство выбора макета данных в памяти.
Возможно, вам будет интересно сохранить дерево в плоском массиве в кэше, не обращая внимания ( "Van Emde Boas tree" ). Он должен работать, но кто знает.:)
(бесстыдный плагин: я уже некоторое время пытался сделать подобное, я использовал некоторые расширенные системные функции языка программирования ATS, чтобы сделать raytracer более безопасным и быстрым, см. код здесь: http://code.google.com/p/ats-miscellanea/ - к сожалению, я еще далеко не прошел)
То, что вы предлагаете, было обнаружено много лет назад, оно называется иерархией ограничивающих интервалов (BIH).