2

この再帰的なマルチスレッド プログラムを考えてみましょう:

#include <iostream>
#include <thread>

#define NUMTHREADS 4
using namespace std;

int g[NUMTHREADS];

thread t[NUMTHREADS];

void task1(int x)
{
    if(x+1<NUMTHREADS)
        t[x] = thread(task1, x+1);
    for(int i=0;i<100000000;i++)
        g[x]++;
    if(x+1<NUMTHREADS)
        t[x].join();
}

int main()
{
    task1(0);
    for(int i=0;i<NUMTHREADS;i++)
        cout<<g[i]<<" ";
}

スレッドのオーバーヘッドはわずかであると予想していますが、実際には、プログラムの実行時間はスレッドの数に比例して増加します。

私の6コアCPUでのタイミングは次のとおりです。

スレッド数 = 1:

$ time ./a
100000000
real    0m0.330s
user    0m0.312s
sys     0m0.015s

スレッド数 = 2:

$ time ./a
100000000 100000000
real    0m0.742s
user    0m1.404s
sys     0m0.015s

スレッド数 = 3:

$ time ./a
100000000 100000000 100000000
real    0m1.038s
user    0m2.792s
sys     0m0.000s

スレッド数 = 4:

$ time ./a
100000000 100000000 100000000 100000000
real    0m1.511s
user    0m5.616s
sys     0m0.015s

なぜこれが考えられるのでしょうか?

4

4 に答える 4

-1

スレッドは、互いに並行して別々のコアで実行すると、パフォーマンスが向上します。そのため、スレッド アフィニティを異なるコアに設定して、各スレッドを異なるコアにバインドします。おそらく、スレッドがシングルコアで実行されている可能性があります。

したがって、スレッド 1、2、3、4 が diff コア 1 2 3 4 に割り当てられている場合 (0 を使用しないでください)、すべてが同時にインデックスを増やします。$cpuinfoプロセッサのコアを確認するには、 を参照してください。を使用thread->setAffinity(core_numer);して、ねじのコアを設定します。

于 2013-09-06T05:21:19.757 に答える
-1

あなたがすべき:

  1. 少なくとも -O2 最適化を使用してコードをコンパイルしてください。

  2. バリアントgを として宣言volatileします。そうしないと、コンパイル中に最適化される可能性があります。

私の 2 コア マシンでは、thread=1 と thread=2 のコストはほぼ同じでした。

于 2013-09-06T05:21:46.863 に答える