0

我有一个 C 代码,它具有以下整体框架:

while (err > tol){
    func_A();
    func_B();
    func_C();
    func_Par();
}

代码正在更改一些全局变量以及它们的连接方式。在func_Par()中,创建了三个线程。所有线程都使用相同的功能,即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 亲和性会使其他函数的时间加倍。我试图弄清楚我应该设置 CPU 亲和力(以提高性能func_Par)同时避免其他功能的性能下降。

仅供参考,我正在使用gccand with -O0flag 编译代码,以确保编译器不会更改任何顺序。此外,我使用的是四核处理器,操作系统是 Linux Ubuntu。

任何帮助表示赞赏。在此先感谢您的帮助。

4

0 回答 0