次の全体的なフレームワークを持つ C のコードがあります。
while (err > tol){
func_A();
func_B();
func_C();
func_Par();
}
コードはいくつかのグローバル変数を変更しており、これがそれらの接続方法です。ではfunc_Par()
、3 つのスレッドが作成されます。すべてのスレッドが同じ関数、つまり を使用していますThreads_Func()
。スレッドの数に基づいて、次のコードを使用しThreads_Func()
て各スレッドの CPU アフィニティを変更します。
pthread_t curThread = pthread_self();
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(thread_number, &cpuset);
pthread_setaffinity_np(curThread, sizeof(cpu_set_t), &cpuset);
これが、説明できない奇妙な動作です。の CPU 時間を測定してい func_A
ますfunc_B
。func_C
結果は次のとおりです (すべての結果はマイクロ秒単位です)。
で CPU アフィニティを設定する場合Threads_Func()
:
func_A: 439197
func_B: 61129
func_C: 400482
func_Par: 2488662
で CPU アフィニティを設定しない場合Threads_Func()
:
func_A: 226677
func_B: 30922
func_C: 242516
func_Par: 4843463
ご覧のとおり、関数は順番に実行されますが、CPU アフィニティを設定すると、他の関数の時間が 2 倍になります。func_Par
他の機能でのパフォーマンスの低下を回避しながら、CPU アフィニティを設定する (パフォーマンスを向上させるために) 何をすべきかを理解しようとしています。
参考までに、コンパイラが順序を変更しないように、フラグをgcc
使用してコードをコンパイルしています。-O0
また、クアッドコアプロセッサを使用しており、OS は Linux Ubuntu です。
どんな助けでも大歓迎です。よろしくお願いします。