私は反復アルゴリズムを実装しました。このアルゴリズムでは、各反復で順序ツリーのトラバーサル (下向きの累積と呼ばれることもあります) が行われ、その後に順序ツリーのトラバーサル (上向きの累積) が続きます。各ノードへの訪問ごとに、次の訪問に使用するための情報を計算して保存する必要があります (後続のポストオーダー トラバーサルまたは後続の反復のいずれかで)。
事前注文トラバーサル中、各ノードは、それとルートの間のすべてのノードがすでに処理されている限り、個別に処理できます。処理後、各ノードはタプル (具体的には 2 つの float) をそれぞれの子に渡す必要があります。ポストオーダー トラバーサルでは、すべてのサブツリー (存在する場合) が既に処理されている限り、各ノードを個別に処理できます。処理後、各ノードは単一のフロートをその親に渡す必要があります。
ツリーの構造は静的で、アルゴリズム中は変更されません。ただし、下向きのトラバーサルの過程で、渡される 2 つの float が両方とも 0 になった場合、このノードの下のサブツリー全体を処理する必要はなく、このノードの上向きのトラバーサルを開始できます。(後続の反復で渡された float がこのノードで非ゼロになる可能性があり、トラバーサルが再開されるため、サブツリーを保持する必要があります)。
各ノードでの計算の強度は、ツリー全体で同じです。各ノードでの計算は簡単です。ノードでの子の数と同じ長さの数値のリストで、いくつかの合計と乗算/除算を行うだけです。
処理中のツリーはバランスが取れていません。通常のノードには 2 つのリーフと 0 ~ 6 個の追加の子ノードがあります。したがって、単純にツリーを比較的バランスの取れたサブツリーのセットに分割することは (私には) 自明ではありません。さらに、ツリーは使用可能なすべての RAM を消費するように設計されています。処理できるツリーが大きいほど、優れています。
私のシリアル実装は、私の小さなテスト ツリーだけで毎秒 1000 回の反復を達成しています。「本物の」木では、1桁(またはそれ以上?)遅くなる可能性があると思います。アルゴリズムが許容できる結果に到達するには、少なくとも 1 億回 (場合によっては最大 10 億回) の反復が必要であることを考えると、アルゴリズムを並列化して、複数のコアを活用したいと考えています。並列プログラミングの経験はありません。
アルゴリズムの性質を考慮した並列化の推奨パターンは何ですか?