gpt4 book ai didi

c++ - sched_getcpu 不工作

转载 作者:太空狗 更新时间:2023-10-29 22:59:21 24 4
gpt4 key购买 nike

我在谷歌云上有一台虚拟机,有 1 个 CPU 插槽,16 个内核,每个内核 2 个线程(超线程)。

这是 lscpu 的输出:

Architecture:          x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 32
On-line CPU(s) list: 0-31
Thread(s) per core: 2
Core(s) per socket: 16
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 63
Stepping: 0
CPU MHz: 2300.000
BogoMIPS: 4600.00
Hypervisor vendor: KVM
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 46080K
NUMA node0 CPU(s): 0-31

我正在它上面运行我的进程,我试图在不同的逻辑 CPU 之间分配我的线程。

unsigned num_cpus = std::thread::hardware_concurrency();
LOG(INFO) << "Going to assign threads to " << num_cpus << " logical cpus";
cpu_set_t cpuset;
int rc = 0;
for (int i = 0; i < num_cpus - 5; i++) {
worker_threads.push_back(std::thread(&CalculationWorker::work, &(workers[i]), i));
// Create a cpu_set_t object representing a set of CPUs. Clear it and mark
// only CPU i as set.
CPU_ZERO(&cpuset);
CPU_SET(i, &cpuset);
int rc = pthread_setaffinity_np(worker_threads[i].native_handle(),
sizeof(cpu_set_t), &cpuset);
if (rc != 0) {
LOG(ERROR) << "Error calling pthread_setaffinity_np: " << rc << "\n";
}
LOG(INFO) << "Set affinity for worker " << i << " to " << i;
}

问题是 num_cpus 确实是 32,但是当我在每个正在运行的线程中运行以下代码行时:

LOG(INFO) << "Worker thread " << worker_number << " on CPU " << sched_getcpu();  

sched_getcpu() 为所有线程返回 0。
跟这是虚拟机有关系吗?

更新:
我发现 pthread_setaffinity_np 确实有效,显然有一些守护进程在后台运行,这就是为什么我看到其他内核被利用的原因。 但是sched_getcpu 仍然不起作用并在所有线程上返回 0,尽管我可以清楚地看到它们在不同的内核上运行。

最佳答案

你能试试在你的虚拟机上运行这个小程序吗:

#include <iostream>
#include <thread>
using namespace std;

int main(int argc, char *argv[])
{
int rc, i;
cpu_set_t cpuset;
pthread_t thread;

thread = pthread_self();

//Check no. of cores on the machine
cout << thread::hardware_concurrency() << endl;

/* Set affinity mask */
CPU_ZERO(&cpuset);
for (i = 0; i < 8; i++) //I have 4 cores with 2 threads per core so running it for 8 times, modify it according to your lscpu o/p
CPU_SET(i, &cpuset);

rc = pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
if (rc != 0)
cout << "Error calling pthread_setaffinity_np !!! ";

/* Assign affinity mask to the thread */
rc = pthread_getaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
if (rc != 0)
cout << "Error calling pthread_getaffinity_np !!!";

cout << "pthread_getaffinity_np() returns:\n";
for (i = 0; i < CPU_SETSIZE; i++)
{
if (CPU_ISSET(i, &cpuset))
{
cout << " CPU " << i << endl;
cout << "This program (main thread) is on CPU " << sched_getcpu() << endl;
}
}
return 0;
}

这会让您了解 pthread_setaffinity_np 是否在 VM 上工作。在 VM 的情况下没有这样的特定限制,相反,这可能是由于云上的内核对某些进程的一些强制执行。您可以阅读更多相关信息 here .

或者尝试使用 sched_setaffinity() 来确认您是否真的能够在 VM 上设置 cpuset。

我找到了您的评论(当我将所有线程的关联设置为单个内核时,线程仍然在不同的内核上运行)和原始帖子的注释(sched_getcpu() 为所有线程返回 0线程)有点困惑。可能,这个 0 是在所有线程中为你的主线程(进程)返回的。

关于c++ - sched_getcpu 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37116946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com