1

そこで、マンデルブロ画像を生成するプログラムを書きました。次に、指定された数のスレッドを使用して高速化する方法で記述することにしました。これは私が思いついたものです:

void mandelbrot_all(std::vector<std::vector<int>>& pixels, int X, int Y, int threadCount) {
    using namespace std;

    vector<thread> threads;
    int numThreads = threadCount;
    for(int i=0; i<numThreads; i++) {
        threads.push_back(thread (mandelbrot_range, std::ref(pixels), i*X/numThreads, 0, X*(i+1)/numThreads, Y, X));
    }
    for(int i=0; i<numThreads; i++) {
        threads[i].join();
    }
}

意図は、処理をチャンクに分割し、それぞれを個別に処理することでした。プログラムを実行すると、その実行のためにプログラムで使用されるスレッドの数として使用される数値を引数として取ります。残念ながら、スレッドの数に関係なく同様の時間が得られます。

私が見逃しているC ++でのスレッド化について何かありますか? スレッドを同時に機能させるために、何かまたは何らかのボイラープレートを追加する必要がありますか? それとも、スレッドを作成する方法がばかげているだけですか?

このコードをラズベリーパイとクアッドコアラップトップで実行してみましたが、同じ結果が得られました。

どんな助けでも大歓迎です。

4

4 に答える 4

0

一度に 1 つの問題を解決するには、2 つのスレッド、次に 3 つのスレッドの使用をハードコーディングしてみませんか? スレッドの開始はコストがかかりますが、2 つのスレッドのみを開始してかなり大きなマンデルブロを計算すると、スレッドの開始時間は比較的ゼロになります。

2 倍および 3 倍のスピードアップを達成できないまでは、別の問題をデバッグして解決する必要があります。

于 2015-07-09T23:53:43.247 に答える
0

スレッドの生成は高すぎると思います。 PPLまたはTBBを試すことができます。どちらにも parallel_for と parallel_foreach があり、スレッドを使用する代わりにそれらを使用してピクセルをループします。スレッドを内部的に管理するため、オーバーヘッドが少なくなり、スループットが最大になります。

于 2014-01-24T02:55:55.960 に答える
-1

コードを見て遊んでみないと、何が問題なのかを正確に特定するのは困難です。ただし、推測は次のとおりです。マンデルブロ集合イメージの一部の部分は、他の部分よりも計算がはるかに簡単です。あなたのコードは画像を x 軸で等しいスライスに分割していますが、作業の大部分 (たとえば 70%) は 1 つのスライスに収まる可能性があります。その場合、残りのスレッドは最後のスレッドが終了するまで待機する必要があるため、30% の速度向上が最善です。たとえば、4 つのスレッドで実行し、画像を 4 つの部分に分割した場合、3 番目の部分は確実に他の部分よりも集中的に見えます。もちろん70%はあくまで目安です。

于 2014-01-24T04:13:03.927 に答える