并行解析 C++

Posted

技术标签:

【中文标题】并行解析 C++【英文标题】:Parallel Parsing C++ 【发布时间】:2016-05-10 12:58:15 【问题描述】:

我想用 C++ 做一些(奇怪的)事情,主要想法如下:

    接收用于控制仪器的命令字符串(SCPI 命令)。可以在向量或缓冲区中接收。 解析字符串并提取单个命令(如果字符串包含多个命令) 解析各个命令以提取助记符和参数(SCPI 命令的元素)。 将助记符与已有的解析器表匹配

有趣的是,我已经有了一个可行的解决方案,但是在批处理/解析命令时速度太慢了。

我希望以减少开销的方式来做到这一点。我的一个想法是从 SERIAL 转向 MULTITHREADED 方法(例如在不同线程中执行上述不同的操作,并最大限度地利用 CPU 内核)。

因此,我需要有关如何以及从何处开始的建议和提示?

【问题讨论】:

不是很了解 SCPI,但您收到的所有“命令”的长度是否相同?命令之间是否有任何关系,是否有顺序? (这意味着某些命令必须在其他命令之前运行。)从这些问题开始,看看代码的哪些部分可能被拆分为线程。 std::thread :-) 什么是“慢”? @ZDF “慢”是指当您使用仪器测试设备并且有很多命令进出时,整体响应效率不高。对于少量的命令来说这很好,但是当你有一个自动化的测试系统时,它会增加很多开销。 @Joachim 命令其实不一样;其中一些接受参数,而另一些则不接受。并且没有命令的顺序。主要任务是解析传入/传出测试仪器的命令,然后进行一些计算(已经使用多线程实现)...... 【参考方案1】:

并行处理命令是将解析命令的逻辑分离并在其自己的线程上运行,在命令从解析器传入时对其进行管道传输。

但是,并行解析串行流是另一回事。为了有效地批处理命令解析,您需要能够在不知道其内容的情况下拆分命令。

一种方法是利用数据包结构将命令块关联在一起,并确保并行解析器接收构建命令所需的所有块。

struct CommandPacket

   uint8_t commandID;
   uint8_t dataLength;
   uint8_t data[MAX_PACKET_SIZE];

您可以简单地使用 id 的模数将数据包通过管道传输到解析器,以平均分配负载。

int parserIndex = packet.commandID % parserCount;

【讨论】:

以上是关于并行解析 C++的主要内容,如果未能解决你的问题,请参考以下文章

有人可以帮我并行化这个 C++ 代码吗?

C++ 并行编程函数调用

C++ Fork Join 并行阻塞

串行输入输出和并行输入输出的区别解析

微软C++并行库 pplx 的基本用法

微软C++并行库 pplx 的基本用法