2012-06-18 5 views
2

Я должен написать реализацию OpenCL Marching Cubes.Динамическая структура данных OpenCL

Алгоритм Marching Cubes берет объемные данные и создает из него изоповерхность. Этот процесс занимает очень много времени, поэтому я должен написать его в OpenCL с n потоками для повышения производительности.

У меня уже есть код, но моя проблема в том, чтобы хранить вершины. Насколько я понимаю, мне нужно знать, сколько вершин будет создано алгоритмом для выделения достаточной памяти, но это число неизвестно. Есть ли способ создать динамическую структуру данных, такую ​​как вектор или numpy.array с функцией добавления или что-то в этом роде.

Я пишу код python для загрузки OpenCL __kernel и должен сделать некоторые другие вещи с вершинами, чтобы он был доступен для чтения с помощью python. Идея заключается в создании плагина blender.

+2

Я не знаю, на какой платформе вы находитесь, но если я правильно помню, CUDA SDK уже содержит пример Marching Cubes (и реализацию OpenCL). Возможно, вы можете использовать это, чтобы получить вдохновение для вашей реализации. – Bart

+0

Спасибо - это действительно помогло мне! – glethien

ответ

1

Насколько я знаю, OpenCL не позволяет использовать какое-либо управление динамической памятью. Одной из причин является то, как работает графический процессор. Создание кода OpenCL просто работает на процессоре, но не на графическом процессоре - это не идея OpenCL.

Вы можете решить проблему следующим образом:

  • Создать огромный буфер памяти. Больше, чем вы могли бы потребовать.
  • Когда у вас есть новая вершина, просто добавьте ее в последнюю добавленную позицию в буфере.
  • Продолжайте так.

Допустим, что в какой-то момент все еще не хватает памяти. В этом случае вы просто создаете больший буфер, копируете память из старой в новую и удаляете старую.

Надеюсь, это помогло.

Смежные вопросы