ふと思いついたので特定コアに処理を割り当ててみた
スレッド(C#の場合はデリゲート)を使うと、「プログラムは上から順番に実行される」原則が覆され、う ち ゅ う の ほ う そ く が み だ れ る!
と思ってしまう。それが初心者クオリティ。
参考:
- http://d.hatena.ne.jp/naoya/20070824/1187945715
- http://www.thinkingparallel.com/2006/08/18/more-information-on-pthread_setaffinity_np-and-sched_setaffinity/
- http://surf.ml.seikei.ac.jp/~nakano/JMwww/html/LDP_man-pages/man2/sched_setaffinity.2.html
やってみた。以下サンプル。
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <sched.h> #include <pthread.h> using namespace std; pthread_mutex_t mutex; int set_cpu_id(int cpu_id) { cpu_set_t mask; __CPU_ZERO(&mask); __CPU_SET(cpu_id, &mask); if (sched_setaffinity(0, sizeof(mask), &mask) == -1) { std::cout << "Failed to set CPU affinity. " << endl; } else std::cout << "Succeed to set CPU " << cpu_id << "affinity. " << endl; return 0; } uint32_t waste_time(uint32_t n){ uint32_t i = 0; while (i < n*200000) { i++; } return i; } void* thread_main(void* pData){ int* cpuID = (int*)pData; set_cpu_id(*cpuID); uint32_t num = waste_time((uint32_t)cpuID); std::cout << "count " << num << endl; pthread_exit(NULL); } int main(){ pthread_t tid1, tid2; int num1 = 5, num2 = 6; int* cpuID1 = &num1; int* cpuID2 = &num2; pthread_mutex_init(&mutex, NULL); pthread_create(&tid1, NULL, thread_main, cpuID1); pthread_create(&tid2, NULL, thread_main, cpuID2); pthread_join(tid1, NULL); pthread_join(tid2, NULL); pthread_mutex_destroy(&mutex); return 0; }