프로그래밍/리눅스 프로그래밍

[리눅스] thread 및 process에 CPU Core 할당 하기

jinkwon.kim 2022. 9. 30. 09:11
728x90
반응형

사용시기 

    1. 실행하는 프로세스와 관련된 인터럽트가 특정 CPU 코어에서만 트리거됨(IRQ Affinity라고 하죠.)
    2. 프로세스가 여러 CPU 코어에 옮겨 다니면서 실행할 때 요구되는 오버헤드(마이그레이션)을 최소화하자
        - 고성능을 내기 위한 프로그램을 구현 할 때 종종 사용 됩니다.

필수 define

#define _GNU_SOURCE

 

헤더

#include <sched.h>  // process에 CPU를 할당 할때 사용

#include <pthread.h> // thread에 CPU를 할당 할때 사용

 

process에 CPU 할당

void set_cpu(int core_id) {
    const pid_t pid = getpid();

    // CPU 정보 초기화 
    cpu_set_t cpuset;
    CPU_ZERO(&cpuset);
    // CPU 정보에 0번 core할당
    int core_id = 0;
    CPU_SET(core_id, &cpuset);

    // process에 CPU 할당 하기
    const int set_result = sched_setaffinity(pid, sizeof(cpu_set_t), &cpuset);
    if (set_result != 0) {
        printf("sched_setaffinity ERROR: %d\n", set_result);
        exit(1);
    }

    // 할당된 CPU 정보 가져오기
    const int get_affinity = sched_getaffinity(pid, sizeof(cpu_set_t), &cpuset);
    if( get_affinity != 0) {
        printf("sched_getaffinitify ERROR: %d\n", get_affinity);
        exit(1);
    }

    // CPU가 잘 할당 됬는지 확인
    if (CPU_ISSET(core_id, &cpuset)) {
        printf("success set thread %d to affinity to cpu %d\n", pid, core_id);
    } else {
        printf("fail to set thread %d to affinity to cpu %d\n", pid, core_id);
    }
}

thread에 CPU를 할당

pthread_setaffinity_np() 함수를 사용합니다. 

void* threadRoutine(void *argumentPointer)
{
    pthread_t id = pthread_self();

    // TID를 반환하고 출력
    printf("thread ID (TID) :: %lu\n", id);

    // CPU 정보를 초기화
    cpu_set_t cpuset;
    CPU_ZERO(&cpuset);
    // CPU 정보에 0번 core 세팅
    CPU_SET(0, &cpuset);

    // thread에 cpu 할당 하기
    if (pthread_setaffinity_np(pthread_self(), sizeof(cpuset), &cpuset) < 0) {
        perror ("pthread_setaffinity_np");
    }

	// thread에 할당된 CPU 정보 가져오기
	if (pthread_getaffinity_np(pthread_self(), sizeof(cpuset), &cpuset) < 0) {
        perror ("pthread_setaffinity_np");
    }


	// thread에 cpu가 잘 할당 되었는지 확인
    if (CPU_ISSET(t_count, &cpuset)) {
        printf("success set thread %ld to affinity to cpu %ld\n", pthread_self(), t_count);
    } else {
        printf("fail to set thread %ld to affinity to cpu %ld\n", pthread_self(), t_count);
    }

    for(int i = 0; i < 1000; i++) {
        printf("%lu : %d\n",id, cnt++);
    }


   // 부모 스레드 부분에서 리턴값을 받기때문에 항상 리턴을 해준다.
    return NULL;
}
728x90
반응형