我需要更新一个 100M 元素的数组,并且希望并行执行。std::for_each(std::execution::par, ...)
看起来很棒,除了更新需要根据我正在更新的索引访问其他数组的元素。最小的serial我尝试并行化的工作示例可能如下所示:
for (size_t i = 0; i < 100'000'000; i++)
d[i] = combine(d[i], s[2*i], s[2*i+1]);
我当然可以手动生成线程,但这比std::for_each
,因此如果能够找到一种优雅的方法来使用标准库来完成此操作,那就太好了。到目前为止我发现了一些不太优雅的使用方式for_each
, 例如:
有一个更好的方法吗?
std::ranges
如果您有权访问 c++20,应该能够提供帮助,您可以迭代索引而不是数据:
#include <ranges>
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> d(100);
std::ranges::iota_view indexes((size_t)0, d.size());
std::for_each(std::execution::par, indexes.begin(), indexes.end(), [&d](size_t i)
{
std::cout << i << "," << d[i] << "\n";
});
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)