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
반응형
'프로그래밍 > 리눅스 프로그래밍' 카테고리의 다른 글
[stress] stress 사용법 (0) | 2023.02.28 |
---|---|
[linux] libc 와 glibc 와 libstdc++ 와 gcc의 관계 정리 (0) | 2022.10.19 |
[GCC] gcc option 설명 (1) | 2022.09.19 |
[GIT] cheat sheet (0) | 2022.07.27 |
tcpreplay-edit 사용법 정리 (0) | 2022.05.24 |