私は仮想マシンに1つのCPUソケットと16コアとコアあたり2つのスレッド(ハイパースレッディング)を持つGoogleクラウドを持っています。sched_getcpuは機能しません
これは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を返すすべてのスレッドのために。
これは仮想マシンであるということと関係がありますか?
UPDATE:
私が利用している他のコアを見た理由です、バックグラウンドで実行されているいくつかのデーモンプロセスをSEREどうやらそこに、pthread_setaffinity_np
が仕事をしていることが分かりました。
,sched_getcpu
はまだ動作しませんし、すべてのスレッドで0を返しますが、別のコアで動作することははっきり分かります。
'pthread_setaffinity_np()'の呼び出しが返った後、各スレッドの 'sched_getcpu()'への呼び出しが実行されていますか? – jotik
@jotikまた、 'pthread_setaffinity_np'関数は実際に何もしません。すべてのスレッドのアフィニティを単一のコアに設定すると、スレッドはまだ別のコアで実行されています。 – eladm26