4
static void testlock()
{
    for(int i=0;i<10000000;i++)
    {
        float f=2.0/i;
    }
}

static void TEST()
{
    cout<<"Start testing" <<endl;
    unsigned int startClock;

    for(int i=1;i<=10;i++)
    {
        startClock = clock();
        vector<boost::thread*> threads;
        for(int j=0;j<i;j++)
            threads.push_back(new boost::thread(&testlock));
        for(int j=0;j<i;j++)
        {
            threads[j]->join();
            delete threads[j];
        }
        cout << i << " threads: "<< clock()-startClock << endl;
    }
}

出力:

Start testing
1 threads: 180000
2 threads: 350000
3 threads: 540000
4 threads: 730000
5 threads: 900000
6 threads: 1080000
7 threads: 1260000
8 threads: 1510000
9 threads: 1660000
10 threads: 1810000

このコードをクアッドコアPC(Core2Quad、ハイパースレッディングなしの4コア)で実行しているので、1〜4スレッドでほぼ同じ時間がかかると予想しました。代わりに、1つのコアのみが使用されているように見えます。ここで何が欠けていますか?

ありがとう

アップデート:

-UbuntuLinuxでEclipseCDTを使用しています

-Pthreadで同じことを試しましたが、同じ結果が得られました

4

2 に答える 2

3

私の同僚が解決策を見つけました。clock() は CPU サイクルを測定するため、2 つのスレッドが実行されている場合は 2 倍の速度で実行されます。gettimeofday のタイミングにより、期待どおりの結果が得られました。

于 2012-06-20T03:36:19.223 に答える
1

まず、withi=0 2.0/iはゼロ除算です(申し訳ありませんが、Igorがコメントで正しく指摘しているように、浮動小数点演算で有効であり、この場合、結果は+無限大になります。

Seconly、それを修正してtestlockも、結果が使用されることはないため、関数はおそらくゼロに最適化されます。

したがって、現時点では、スレッドの作成と結合のオーバーヘッドを測定しているだけなので、線形に増加します。

于 2012-06-19T09:39:13.780 に答える