私は遺伝的アルゴリズムに取り組んでおり、価値のあるスピードアップを達成できるかどうかを確認するために、いくつかの関数を cuda に入れてみたかったのです。
現時点でのデータ構造はノードのツリーであり、関数ノードには、それらが持つ可能性のある子ノードへのポインターのベクトルが含まれています。このツリーをリンクされたリスト、おそらくノードのベクトル (ポインターではない) に折りたたむ必要があると思います。これらのノードには、子ノードへの整数インデックスのリストが含まれます。このようにして、構造体を cuda に値で渡すことができます。
root/ (0)
├── add (1)
│ ├── 5 (2)
│ └── divide (3)
│ ├── 10 (4)
│ └── 5.7 (5)
└── multiply (6)
├── 1.2 (7)
└── 77 (8)
非常に簡単に平坦化できますが、これらの変更を行うにはいくつかのカスタム関数が必要になり、node->childNode[x] スタイル構造よりもはるかに計算コストが高くなる可能性があるのではないかと心配しています。
たとえば、除算とそのサブ構造を数字の 7 に置き換えたい場合は、次のようにする必要があります。
- ポップメンバー 4,5
- インデックス 3 の分割を数値 7 に変更します。
- ルート関数を更新して、2 番目の子への参照が 4 になるようにします。
- 乗算関数を更新します。現在は 4 です。つまり、子ノードは現在 5 と 6 です。
もっと良い方法があるはずですか?私は C++ の専門家ではないので、アドバイスやコード例を探しています。とても役に立ちます!