http://forumloverz.blog18.net
就可以使用intptr_t
所以在這邊的struct就是link list的node裡面的data有做型態轉換
node 定義完後,就可繼續定義 llist_t:
定義完型態,接著是各種操作:
到這邊是list.h的內容
在這邊我同時看了讀了C 的 Thread Pool 筆記下圖是表示圖
首先 Thread Pool 要有的東西就是 job 或者是 task 讓 Thread 知道他們要做什麼事情。
定義 task_t 來封裝 task:
在這邊task queue適用double-link list來建立成的
定義Task的free操作
所以只要有一個資料結構紀錄要執行的 function pointer 與要傳遞的參數即可。 接下來就是 Thread Pool 本身,他必須存放所有的 Thread 與 Job Queue
再來是 thread pool 所需的 queue 結構:
這邊他使用了task_t 的 pointer 來紀錄thread pool中的task queue,簡單來說就是一個 task_t 的 array,而 head, tail 就是紀錄 array 的 offset。
其中用到了mutex(參考:[轉]Linux 中程式同步處理概念 - Mutex)、pthread_cond_t,他們常常一起使用為什麼呢?這邊有一個很好的例子可以搞懂
在這邊我也同時看了Mathias Brossard的thread pool作法
與Johan Hanssen Seferidis的thread pool做法,
看有沒有機會來修改程式
接著把 queue 和 thread 包裝成 thread pool:
想要知道這邊是怎麼包裝的要詳細去看tpool_init
會比較了解,這邊用簡單的圖示來表達我對於這段code的理解
tqueue_t * queue就是task queue的宣告,而pthread_t *threads就是thread pool的宣告
看到這邊大概就了解了程式的架構了
之後實做task_run
作為稍早提到流程圖的主迴圈 (main-loop)
有了這樣的基礎建設,mergesort 就很容易透過 task 這樣的包裝,加入 thread pool 中。
這邊是mutrace的結果
(for i in {1..8}; do echo $RANDOM; done) | mutrace ./sort 1 8
(for i in {1..8}; do echo $RANDOM; done) | mutrace ./sort 2 8
(for i in {1..8}; do echo $RANDOM; done) | mutrace ./sort 4 8
我想要先觀察thread number對於執行時間的影響
先修改Makefile
將時間抓出來
最後結果
將資料換成80000筆
將資料換成160000筆
在閱讀TempoJiJi
同學的筆記後我決定修改我的Makefile,我寫的實在有夠爛,好想直接刪掉,這邊是他的版本
我改了一下,這邊先寫出我自己的版本,但我實在有夠廢,卡一整晚卡在grep不知道怎麼用在Makefile裡面
好吧,簡單說我的改法就是將TempoJiJi
的input_generator換成直接用在Makefile裡的command不用再多跑一個程式,但是我的時間要怎麼抓還要再想想,可能我在請教一下TempoJiJi
你需要比照之前 clz 作業的統計模型,因為涉及到輸入資料實際上是處於不連續記憶體的分佈,變因頗多,最好先縮減範圍 jserv
好的,會仔細去比較看看 SwimGlass
閱讀 Measure time in Linux - time vs clock vs getrusage vs clock_gettime vs gettimeofday vs timespec_get?
參考並修改王紹華同學的compute pi來做信賴區間的實作,來統計執行的時間,下面就是有著信賴區間的自動測試版本
最後的執行成果在這邊
邊可以發現時間會隨著thread number的數量增加而增加,本來是想探討thread數量對於mutex使用的影響,但是目前測出來最高就是用到三個
詢問過後:計算merger sort 的空間複雜度,建立memory pool給merge sort 使用,分析完後配置最大空間,但是同一時間可能會同時有兩個地方在merge,防範overlap ,要把記憶體切成若干區段,最後的資料搬動(找memory pool的實作),malloc的回收
排序的資料在記憶體中不連續(找link-list cache)