gpt4 book ai didi

c++ - 使用 boots::spirit::qi 进行解析的 TBB 并行化

转载 作者:太空宇宙 更新时间:2023-11-04 13:39:58 25 4
gpt4 key购买 nike

在我的程序中,我使用 Boost-Spirit-Qi 来解析大型数据集。输入数据是顺序记录。我正在尝试使用 TBB 来提高解析效率。并行处理的流程如下:

typedef map<string, data_struct_t> mdata_t;
vector<string> text;
mdata_t data;

parallel_for(blocked_range<size_t>(0, input.size(), gs),
[&] (blocked_range<size_t>& r) {
data_struct_t cs;
mdata_t cr;
string s;
for(size_t i=r.begin(); i<r.end(); i++) {
s = text[i];
Parser::task1(s, cs);
Parser::task2(s, cs);
Parser::task3(s, cs);
....
Parser::task8(s, cs);
cr.insert(std::make_pair(cs.title, cs));
}
data.insert(cr.begin(), cr.end());

}, ap);

我的程序只使用了 10% 的 CPU(2 个 CPU,16 个内核)并且在 8 个内核上运行。我不明白为什么不使用剩余的 8 个内核(单处理器)。如果能指出正确的算法并行化此任务,我将不胜感激。

感谢您的建议。

斯坦

最佳答案

您的 input.size() 可能很小或 gs 太大而无法创建足够的并行度。否则,如果线程数是一个问题,请在启动时检查程序的进程(亲和性)掩码以及 TBB 是如何初始化的(例如,如果 tbb::task_scheduler_init 是用少量线程创建的线程)。

至于 CPU 利用率,当您​​的工作受 IO 限制时(即读取文件),预计会出现这种情况。完成一次并行迭代所需的时间也可能与另一次迭代相差很多。在这种情况下,甚至在创建所有线程之前就可能完成小的迭代。 (如果你想准确地测量加速比,你应该手动等待所有线程都在运行)

建议:

data.insert 有一个错误,因为 std::map 对于并发修改是不安全的。使用 tbb::concurrent_unordered_map 或仅使用 tbb::parallel_reduce 以合并从不同线程收集到 cr 中的部分结果。

模式 Parser::task1(s, cs); ... Parser::task8(s, cs); 如果任务不共享全局状态,也可以并行化。参见 tbb::parallel_pipeline这将为这些独立任务链启用管道类型的并行性。

关于c++ - 使用 boots::spirit::qi 进行解析的 TBB 并行化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28089138/

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