繁体   English   中英

如何并行化 C++ 向量写入

[英]How to Parallelize C++ Vector Writes

std::vector<size_t> vector;
    std::vector<size_t> v_vector;

您好,假设 2 个线程正在读取“ vector ”并计算一个简单的数学运算,然后将结果保存在v_vector中。

使用全局互斥锁来确保线程锁定和解锁相同的互斥锁如何并行化,以便 2 个线程读取、计算数学运算并将内容存储在v_vector中比单个线程更快。

到目前为止的想法,将 vector.size() 分成两半。 让线程 1 从 0 迭代到向量一半,让第二个线程从向量一半迭代到向量结束。 (但是,这似乎存在写访问冲突,不确定为什么两个线程的向量写入都受到互斥锁的保护)

线程将值推入v_vector的顺序无关紧要。

任何其他想法或如果您看到任何逻辑问题将不胜感激!

只要没有线程调整向量的大小,您就可以根据需要让许多线程读取和写入。 向量不会在意。

您需要注意的是线程不使用每个向量的相同元素,否则您将不得不添加互斥锁以同步访问。

如果每个元素的工作大致恒定,则使用v.begin()', v.end() and std::midpoint` 将向量分成两半是最好的方法。

所以运行你的线程:

{
    v_vector.resize(vector.size());
    auto mid = std::midpoint(vector.begin(), vector.end());
    auto v_mid = std::midpoint(v_vector.begin(), v_vector.end());
    std::jthread thread1(compute, vector.begin(), mid, v_vector.begin());
    std::jthread thread2(compute, mid, vector.end(), v_mid);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM