我正在尝试在Linux上调试pthreads的一些性能问题,我认为sched_getcpu()可能对我说谎。它为每个线程报告一个恒定的CPU,而分析实验似乎表明线程在其生命周期中实际上是从一个核心迁移到另一个核心。
我想知道sched_cpu()
是否只报告线程开始运行的第一个CPU,并且不知道线程迁移?有没有人注意到这一点,或者看到任何证据表明sched_getcpu()
的返回值可能会发生变化?如果它不可行,是否还有其他方法可以跟踪当前CPU(可能使用CPUID
?)?
答案 0 :(得分:5)
http://man7.org/linux/man-pages/man2/getcpu.2.html表示sched_getcpu()只是getcpu()的包装器。
http://man7.org/linux/man-pages/man2/getcpu.2.html表明所提供的信息准确无误,因为不再使用旧的缓存选项:
自Linux 2.6.24起,tcache参数未被使用...它指定了一个 指向线程局部存储中调用者分配的缓冲区的指针 用于为getcpu()提供缓存机制。使用缓存 可以加速getcpu()调用,代价是非常小 返回的信息可能已过期的可能性。缓存 在迁移线程时,机制被认为会导致问题 在CPU之间,所以现在忽略了参数。
因此,除非您使用的是2.6.24之前的内核,否则您似乎不太可能看到旧的/缓存信息。
答案 1 :(得分:1)
调用sched_getcpu有两个问题:
如果您使用的是Intel运行时,则可以设置KMP_AFFINITY = verbose,因为当程序执行其第一个并行部分时,它将在stderr上提供相同的信息(格式不同)。