【问题标题】:vector --> concurrent_vector migration + OpenGL restriction向量 --> concurrent_vector 迁移 + OpenGL 限制
【发布时间】:2012-03-30 22:09:59
【问题描述】:

我需要加速一些计算和计算结果然后用于绘制OpenGL模型。 当我将 std::vector 更改为 Concurrency::concurrent_vector 并使用 parallel_for 而不仅仅是 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 数组,但也想使用与 OpenGL 输出不兼容的 concurrent_vector。

有什么建议吗?

【问题讨论】:

  • @Igor:因为我对concurrent_vector 有另一个问题,我想问一下您的意思是,cv 没有按顺序排列其项目?我的印象是,concurrent_vector 具有与向量相同/相似的内存布局,并且只是通过例如防止竞争条件。内部互斥体。

标签: windows opengl concurrency ppl


【解决方案1】:

您尝试使用的数据结构不会在需要连续存储的 API 中连续存储其元素。好吧,其中之一必须放弃,而且它不会是 OpenGL。 GL 不会遍历concurrent_vector 的数据结构(如果您喜欢性能,则不会)。

所以你的选择是不使用非顺序对象。

我只能猜测你在做什么(因为你没有提供生成器的示例代码),所以这限制了我可以提供的建议。如果您的 parallel_for 迭代固定次数(通过“固定”,我的意思是在 parallel_for 执行之前立即知道的值。它不会根据您迭代的次数而改变),那么您可以使用普通的vector

vector::size 简单地调整向量的大小。这将对元素进行值初始化,这意味着每个元素都存在。您现在可以执行 parallel_for 循环,但不要使用 push_back 或其他任何东西,您只需将元素直接复制到其在输出中的位置即可。我认为parallel_for 可以迭代实际的向量迭代器,但我并不肯定。无论哪种方式,都没有关系;除非您尝试从不同的线程设置 same 元素,否则您不会得到任何竞争条件。

【讨论】:

  • 是的,我在几个循环上使用向量预分配实现了这个技巧。在那里我可以预先计算向量的大小,然后在 parallel_for 中使用 operator[]。对于这个特定的循环,情况并非如此 - 几何模型可能会发生变化,并且顶点数可能会发生巨大变化。
猜你喜欢
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 2023-03-30
  • 2011-07-20
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 2018-05-23
相关资源
最近更新 更多