0

私はマルチスレッド(これまでの経験はありません)で遊んでいて、2つのforループ内から変数を変更(および作成)する2つの別々のスレッドを介してintmainから呼び出される単純な関数を持っています。私の知る限り、どちらのスレッドにも依存関係はありませんが、1つのスレッドが実行されている場合のタイミングは2.29秒で、2つのスレッドの場合のタイミングは7.11秒です(3〜4秒のようなものを期待していました)。

私は2つのIntelアトムCPUを搭載したネットブックで実行しています(Ubuntu 10.04)-int main()プロセス自体がスレッドを含むため(OSと一緒に)、どちらのスレッドも単一のCPUの完全な「所有権」を取得しないことを認識していますニーズ)が、パフォーマンスのヒット(おそらくスレッドの切り替え!?)にショックを受けました

ここで改善できる方法はありますか?(おそらく、スレッド間をジャンプするためにCPUが実行する必要のある作業を減らします)。私はもう少し肉厚なことをしたいと思っています(異なるスレッドが異なるスポークを所有するホイールファクタリングによるプライムふるい分け)が、私は今得ているパフォーマンスにあまり感心していません

私が今持っている簡単なコードは次のとおりです。

#include <iostream>"
#include <ctime>
#include <pthread.h>


void* foo(void* dummyVar)
{
    for(int i=1; i < 10; i++)
    {
        for(int j=1; j < 50000000; j++)
        {
            int test = j;
        }
            std::cout << i << "\n";
    }
    pthread_exit(NULL);
}

int main(int argc, const char *argv[])
{
    clock_t start = clock();
    pthread_t thread1;
    pthread_t thread2;
    pthread_attr_t attribute;
    void* status;
    pthread_attr_init(&attribute);
    pthread_attr_setdetachstate(&attribute, PTHREAD_CREATE_JOINABLE);
    int i = 0;
    int b = pthread_create(&thread1, NULL, foo, (void*)i);
    int c = pthread_create(&thread2, NULL, foo, (void*)i);
    pthread_join(thread1, &status);
    pthread_join(thread2, &status);

    std::cout << ((double)clock() - start) / CLOCKS_PER_SEC << "\n";
    return 0;
}

更新:main()に関連付けられたスレッドが(2つのスレッドではなく)他の1つのスレッドがfooを呼び出した後にfooを呼び出すことで、パフォーマンスが向上します(2つのスレッドではなく)が、このマシンではマルチスレッドがまだ低速です( foo-ループの1つだけ-タイミングは5.17対6.01)

4

1 に答える 1

2
    for(int j=1; j < 50000000; j++)
    {
        int test = j;
    }

適切なベンチマークは素晴らしい芸術ですが、これはすぐに失敗します。このコードが生き残る唯一の方法は、オプティマイザーをオンにするのを忘れることです。まともなコンパイラでは、有用な副作用がないため、ループを完全に排除します。

実際にオプティマイザを有効にしたと仮定すると、実際には 10 回測定しています。

  std::cout << i << "\n";

同時に実行できないステートメントであり、スレッドは端末/コンソールへのアクセスをシリアル化するロックをめぐって争うことになります。これが実際に遅くなるという予想される結果で。

しかし、オプティマイザーを忘れた可能性が高く、オンにせずにコードをプロファイリングすることはありません。そのように出荷することはありません。

于 2012-12-02T22:06:12.650 に答える