2013-04-16 5 views
7

C++ 11에서 std :: thread를 사용하는 동안 코어 선호도 (스레드 1은 첫 번째 코어, 스레드 2는 두 번째 코어 ...)를 설정하려고합니다.스레드 얻기 C++ 11에서 pthreads를 통해 코어 선호도

저는 이미 다양한 주제와 인터넷에서 검색했으며 C++ 11 API는 그러한 저수준 기능을 제공하지 않습니다. 한편

는 pthreads의 내가 "가 pthread_t"내 표준의 값 : 스레드를 얻을 수 있다면이 인간의 합리적인 또는 적어도 합법적 묻는 경우 나도 몰라 (유용 할 것이다 pthread_setaffinity_np와 함께 그것을 위해).

나는 결국 가지고 싶어하는 예를 보자 프로그램은 이것이다 :

#include <thread> 
#include <pthread.h> 
#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 

#define CORE_NO 8 

using namespace std; 

void run(int id) { 
    cout << "Hi! I'm thread " << id << endl; 
    // thread function goes here 
} 

int main() { 
    cpu_set_t cpu_set; 

    CPU_ZERO(&cpu_set); 
    for(int i=0; i<CORE_NO; i++) 
     CPU_SET(i, &cpu_set); 

    thread t1(run, 1); 

    // obtaining pthread_t from t1 

    /* 
    pthread_t this_tid = foo(t1); 
    pthread_setaffinity_np(this_tid, sizeof(cpu_set_t), &cpu_set); 
    */ 

    t1.join(); 

    return 0; 
} 

난 정말 (같은 특성을 제공해야합니다) 내 프로젝트의 전체 구조를 변경하지 않으려는 것입니다. 지금은 std :: thread를 방대한 용도로 사용했지만 예제에서 보았 듯이 pthread API도 사용할 수 있습니다.

이 문제를 해결할 방법이 있습니까?

+0

'이러한 특성을 제공해야합니다. - 스레드 선호도를 설정 한 후에 어떤 성능 향상을 보았습니까? 번호가 있으십니까? –

+0

@ 마틴 제임스 - 두 번째. Rob013 - 내 경험상, OS가 자동으로 어쨌든 수행 할 핵심 어피 니티 (core affinity)를 어지럽히 기 전에 아주 특별한 상황을 만들어야합니다. 그리고 프로그램 실행중인 하드웨어에 관계없이 스레드에 대한 최적의 친화력을 런타임에 해결하려면 코드로드가 필요합니다. 이는 혼란 스럽습니다. 당신은 아마도 OS가 최선을 다하는 것이 더 낫다. 핵심 동질성이 정말로 필요하다면 어쨌든 아키텍처를 완전히 망칠 것입니다. – bazza

+2

귀하의 조언에 감사드립니다. 나는 당신의 견해를 보았습니다. OS 스레드 관리가 며칠 전 핵심 동질성을 배웠던 학생보다 낫다고 확신합니다. 그건 그렇고, 내 질문은 포팅 프로젝트 내에서의 특정 문제에 관한 것이 었습니다. 그래서 나는 "우리는 * 핵심 동질성을 사용합니다. 당신은 그것을 구현합니다."라고 말했습니다. 그리고 요아킴의 해결책은 충분합니다. – Rob013

답변

10

native_handle 함수를 사용하여 스레드의 네이티브 핸들을 얻을 수 있습니다.

링크 된 참조의 예제는 pthread 함수를 호출하기 위해 이것을 사용합니다.

+1

예, 그렇지만 pthread_t 유형이 될 것이라고 보장 할 수는 없습니다. PThreads 자체는 기본 OS의 기본 스레드의 최상위 계층입니다. NPTL이있는 Linux가 예외 일 수 있습니다. 따라서 코어 어피 니티를 처리하려면 OS 관련 루틴이 필요합니다. – bazza

7

귀하의 경우 적절한 접근 방법인지는 잘 모르겠지만 일반적으로 스레드 내에서 선호도 프리미티브를 호출하는 것입니다. 예를 들면, 나는 어딘가 나사 함수의 시작 부분에 이것과 같은 코드를 삽입 :

const int err = pthread_setaffinity_np(pthread_self(),...); 

pthread_self()에 대한 호출은 호출 스레드의 ID를 반환합니다.