我有一个用例来创建std::vector
具有许多元素的 ,每个元素都是简单但非原始的类型(POD 结构)。向量和类型足够大/复杂,在下面,
std::vector<U> v;
v.resize(1000000000);
for(size_t i=0;i<v.size();++i){/* initialize v[i] */}
该resize
呼叫是明显减慢。这很浪费,因为resize
默认初始化所有这些条目,然后我循环遍历并将它们全部设置为正确/有用的值。
我想做的是为向量分配所有内存,但不初始化任何条目,然后并行执行并初始化所有条目,例如使用 OpenMP
std::vector<U> v;
v.reserve(1000000000);
#pragma omp parallel for
for(size_t i=0;i<v.size();++i){/* initialize v[i] */}
但是,reserve
实际上并没有改变 的大小v
,所以我必须继续push_back
在我的循环中进行,这不会保持元素的正确顺序(这在我的用例中很重要);我真的很想v[i] = ...
在我的循环体中写一些类似的东西。
有没有办法在不初始化任何元素的情况下分配/“初始化”一个向量,然后并行填充/初始化所有元素?
您的选择是:
std::vector
为替代方案(例如uvector)执行调整大小后,您可以按常规方式使用 OpenMP。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句