2012-03-30 3 views
0

Мне нужно ускорить некоторые вычисления и результат вычисления, а затем использовать для рисования OpenGL-модели. Главное ускорение архивировано, когда я изменил std :: vector на Concurrency :: concurrent_vector и использовал parallel_for вместо просто для циклов. Этот вектор (или concurrent_vector) рассчитан для цикла (или parallel_for) и содержит вершины для OpenGL для визуализации.vector -> conturrent_vector migration + OpenGL ограничение

Это нормально, используя std :: vector, поскольку процедура рендеринга OpenGL основана на том факте, что std :: vector сохраняет свои элементы в последовательности, которая не является случаем с concurrent_vector. Код работает что-то вроде этого:

glVertexPointer(3, GL_FLOAT, 0, &vectorWithVerticesData[0]); 

Для создания concurrent_vector и скопировать его в StD :: вектор является слишком дорогим, так как есть много пунктов.

Итак, вопрос в том, что я хотел бы использовать массивы OpenGL, но также хотел бы использовать concurrent_vector, который несовместим с выходом OpenGL.

Любые предложения?

+0

@ Igor: Поскольку у меня есть еще одна проблема с 'concurrent_vector', я хотел спросить, что вы имеете в виду, говоря, что cv не сохраняет свои элементы в последовательности? У меня сложилось впечатление, что 'concurrent_vector' имеет ту же/подобную структуру памяти, что и вектор, и просто защищает от условий гонки через, например, внутренние мьютексы. – MikeMB

ответ

0

Вы пытаетесь использовать структуру данных, которая не сохраняет свои элементы в API, что требует непрерывного хранения. Ну, один из них должен дать, и это не будет OpenGL. GL не собирается ходить по структуре данных concurrent_vector (нет, если вам нравится производительность).

Таким образом, ваш вариант заключается в том, чтобы не использовать несекретные объекты.

Я могу только догадываться о том, что вы делаете (так как вы не представили пример кода для генератора), поэтому ограничивайте то, что я могу посоветовать. Если ваш parallel_for выполняет итерацию фиксированное число раз (по «фиксированному», я имею в виду значение, которое известно непосредственно перед выполнением parallel_for. Оно не изменяется в зависимости от того, сколько раз вы повторяли), тогда вы можете просто использовать правильный vector.

Просто размер вектора с vector::size. Это приведет к инициализации элементов, что означает, что каждый элемент существует. Теперь вы можете выполнить цикл parallel_for, но вместо того, чтобы использовать push_back или что-то еще, вы просто копируете элемент непосредственно в его местоположение на выходе. Я думаю, parallel_for может перебирать итераторы, но я не уверен. В любом случае, это не имеет значения; вы не получите никаких условий гонки, если не попытаетесь установить тот же самый элемент из разных тем.

+0

Да, я сделал этот трюк с предварительным назначением вектора на пару петель. Там я мог заранее рассчитать размер вектора, а затем использовать operator [] внутри parallel_for. Для этого конкретного цикла это не случай - модель геометрии может измениться, а число вершин можно резко изменить. – IgorStack

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

  • Нет связанных вопросов^_^