私はずっと前に書いたコードを修正していましたが、スレッドをより有効に活用するために(そして一般的にプログラミングをより有効に活用するために)書き直すことにしました。
ここにあります:https ://github.com/buddhabrot/buddhabrot/blob/master/basic.c :
ブッダブロをフラクタルにするアプリケーションです。この質問の範囲外の理由により、これを最適化するためにメモ化を使用することは困難です。基本的に、これをプロファイルすると、99%以上の時間が最終的に行われる最も内側のループに費やされます。
buddhabrot[col][row]++;
複数のスレッドがこのコードを実行します。インクリメントはスレッドセーフではないため、メモリのこの部分で特定のミューテックスロックを使用しました。したがって、buddhabrotメモリ内のアドレス可能な各場所には個別のミューテックスがあります。
さて、これはもちろん1つのロックを使用するよりも効率的です(これにより、すべてのスレッドが互いに待機するようになります)が、メモリ効率は低くなります。ミューテックスもいくつかのデータを取得しているようです。また、何百万ものミューテックスを使用したpthreadの実装における他の影響についても疑問に思っていますか?
私は今、考慮すべき他の2つの戦略があります。
マップ内の「領域」ごとに、密度の低いミューテックスロックのセットを使用します。したがって、たとえば、[col / 16] [row / 16]のロックは、スレッドが別のスレッドと同じ16ピクセルの領域にアクセスした場合にのみスレッドをロックします。ロックの密度は動的に調整できます。しかし、これをモデル化しているときに、カーネルによって実装される可能性のある既存の問題を解決していないのではないかと思っていました。また、速度を落とさずにこれを作成する方法を見つけることもできません。「ミューテックスのツリー」についても考えましたが、このループ内ではすべてが遅すぎます(コンパイラの背後にあるいくつかの数学演算の順序を最適化した後、プロセッサ時間を約30%長くすることができました) 。このためのトピックはありますか、「ミューテックス密度計画」に関する詳細情報をどのように探すのですか?
各スレッドのメモリをコピーして、その周りでミューテックスする必要がないようにします。しかし、これはさらにメモリ効率が悪くなります。それは、その影響を知らなくても、何百万ものミューテックスを持つという問題を解決します。
それで、他に何かありますか、私にもっと良いことがありますか?