私はマルチスレッド(これまでの経験はありません)で遊んでいて、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)