vector -> миграция concurrent_vector + ограничение OpenGL - PullRequest
0 голосов
/ 31 марта 2012

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

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

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

Генерировать concurrent_vector и копировать его в std :: vector слишком дорого, так как есть много элементов.

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

Есть предложения?

1 Ответ

0 голосов
/ 31 марта 2012

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

Таким образом, вы не должны использовать непоследовательные объекты.

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

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

...