2016-05-10 6 views
0

私は以下のようにいくつかの主要なアイデアをC++で(変な)何かをしたい:パラレル解析C++

  1. は、コマンドの文字列を受け取る(SCPIコマンド)の楽器を制御するために使用します。ベクトルまたはバッファーで受け取ることができます。
  2. 文字列を解析し、個々のコマンドを抽出します(文字列に複数のコマンドが含まれる場合)
  3. 個々のコマンドを解析して、ニーモニックと引数(SCPIコマンドの要素)を抽出します。
  4. マッチニーモニックすでに利用可能なパーサテーブルと

面白いことは、私はすでに実用的なソリューションを持っているが、それは、コマンドのバッチ処理/解析に来るとき、それはとても遅いです。

私は、オーバーヘッドが減少するようにしています。私が持っている1つのアイデアは、SERIALからMULTITHREADEDへのアプローチ(異なるスレッドで前述したように異なるものを実行し、CPUコアを最大限に活用するなど)に移行することです。

私は、どのように、どこから始めるべきか、提案やヒントが必要ですか?

+2

SCPIは実際にはわかりませんが、同じ長さの「コマンド」はすべて受信していますか?コマンドとシーケンスの間に関係はありますか? (いくつかのコマンドは他のコマンドの前に実行しなければならないという意味です)これらの質問から、コードのどの部分がスレッドに分割される可能性があるかを調べてください。 –

+0

['std :: thread'](http://en.cppreference.com/ w/cpp/thread/thread):-) – Zereges

+0

「遅い」とはどういう意味ですか? – ZDF

答えて

0

コマンドを並行して処理することは、コマンドを解決して独自のスレッド上で実行するロジックを分離し、パーサから来るコマンドをパイプすることです。

しかし、シリアルストリームを並列に解析することは別の問題です。コマンド構文解析を効果的にバッチするには、コマンドの内容を知らなくてもコマンドを分割できる必要があります。

パケット構造を利用してコマンドチャンクを結合し、パラレルパーサーがコマンドを構成するために必要なすべてのチャンクを受け取るようにする方法があります。

struct CommandPacket 
{ 
    uint8_t commandID; 
    uint8_t dataLength; 
    uint8_t data[MAX_PACKET_SIZE]; 
} 

負荷を均等に分散させるために、idの係数を使ってパーサーにパケットをパイプすることができます。

int parserIndex = packet.commandID % parserCount;