我有一个 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
)同时避免其他功能的性能下降。
仅供参考,我正在使用gcc
and with -O0
flag 编译代码,以确保编译器不会更改任何顺序。此外,我使用的是四核处理器,操作系统是 Linux Ubuntu。
任何帮助表示赞赏。在此先感谢您的帮助。