gpt4 book ai didi

C++:为 std::vector 分配内存,然后并行初始化其元素

转载 作者:行者123 更新时间:2023-12-02 04:04:41 25 4
gpt4 key购买 nike

我有一个用例,用于创建带有许多元素的std::vector,每个元素都是简单但非原始的类型(POD struct )。 vector 和类型足够大/复杂,如下所示,

std::vector<U> v;
v.resize(1000000000);
for(size_t i=0;i<v.size();++i){/* initialize v[i] */}

resize 调用明显很慢。这是浪费的,因为 resize 默认初始化所有这些条目,然后我将循环执行并将它们全部设置为正确/有用的值。

我想做的是为 vector 分配所有内存,但不初始化任何条目,然后并行遍历并初始化所有条目,例如使用 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] = ... 的内容。

有没有一种方法可以分配/“初始化” vector 而不初始化其任何元素,然后并行填充/初始化所有元素?

最佳答案

您的选择是:

  • std::vector 替换为替代方案(例如 uvector )
  • 使用某种库来调整大小而无需初始化,例如 UninitializedMemoryHacks来自 Facebook。

执行调整大小后,您可以按常规方式使用 OpenMP。

关于C++:为 std::vector 分配内存,然后并行初始化其元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59380836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com