0

次の全体的なフレームワークを持つ 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_Bfunc_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 です。

どんな助けでも大歓迎です。よろしくお願いします。

4

0 に答える 0