2014-03-27 6 views
1
hwloc_obj_t obj = hwloc_get_obj_by_depth(topology, depth_CORE,MyRank%4); 
hwloc_cpuset_t cpuset = hwloc_bitmap_dup(obj->cpuset); 
hwloc_set_cpubind(topology, cpuset, 0) 

스레드가 이미 "cpuset"에 바인드되어 있는지 hwloc에 알 수 있습니다. 이유를 알아야 할 이유 : 쿼드 코어가 있다고 가정합니다. 하지만 런타임에 8 개의 프로세서를 발행하면됩니다. 따라서 두 프로세스를 각 코어에 바인딩합니다. 그러나 프로세스가 코어가 될 때만 코어에 바인드하려고합니다. 어쨌든 핵심이 이미 프로세스에 묶여 있음을 알 수있었습니다.코어가 이미 바인드되어 있는지 확인하는 방법

답변

1

이렇게하는 유일한 방법은 모든 프로세스를 열거하고 그 중 일부가 지정된 코어에 바인딩되어 있는지 확인하는 것입니다. hwloc-ps 유틸리티의 소스 코드를 검토하여이를 수행하는 방법을 알 수 있습니다. 그것은 파일 시스템을 통해 /proc 파일 시스템을 읽고 프로세스 PID를 추출한 다음 hwloc_get_proc_cpubind()을 사용하여 바인딩 마스크를 얻는 것입니다. 이것은 리눅스와 솔라리스뿐만 아니라 /proc이 마운트 된 * BSD 시스템에서도 작동합니다. Windows에서는 Tool Help library의 시스템 특정 API를 사용하여 PID 목록을 얻어야합니다. OS X은 프로세서 선호도를 지원하지 않습니다.

+0

감사! getpid()를 사용하여 pid를 얻을 수 있습니다. 하지만 hwloc_get_proc_cpubind (토폴로지, ppid [i], set [i], 0)를 사용하면 세그먼테이션 오류가 발생합니다. 여기서 내가 뭘 잘못하고 있니? – Biparite

+0

'hwloc_bitmap_alloc()'을 사용하여'set [i]'를 초기화합니까? –

+0

아니요 "hwloc_cpuset_t set [Numprocs]"사용 안함? – Biparite

관련 문제