星期五, 10月 12, 2007

最近

又到了禮拜五,雖然還沒上課,總有喘口氣的感覺。efang回家,沒有朋友來訪,這個週末可以一人較為隨性。

最近總有追著時間跑的感覺,雖然不再像從前天天作息不正常了,但是總有一股無法帶走的疲倦感,或許,從高中以來,沒有花那麼多時間在念課內書? XD

有時候會想問自己,到底可以把心思分給多少人呢? 分給太多就忽略我覺得很重要的人,不分的話,總覺得自己過於自私,什麼時候要分給自己呢? 或許,這答案顯然不那麼重要,呵。

有一個寧靜的早晨不錯,至少還可以胡思亂想XD

---
又是廢話一篇XD

星期四, 10月 11, 2007

小考


傳說中,這是以小考聞名的學校XD

---
我該說什麼XD

星期三, 10月 10, 2007

Desktop

桌上型電腦竟然掛了,經研判是掛在主機板,是我太久沒有用了嗎...Orz

---
只剩MacBook ??

星期二, 10月 09, 2007

The Matrix Game: 16 Matrix Multiplication

最後的程式碼釋出,比賽的文件分享也告一段落啦!!

打包嘍

稍微說明一下

  • document.pdf: 此次比賽最後繳交的文件,李春良老師指導(不然我們應該寫的很難看...Orz)。
  • MatrixMult.c: 主程式,最主要用來執行16個矩陣相乘
  • Matrix.h, Matrix.c: 矩陣的相關基本工具。
  • MCPT.h, MCPT.c: Matrix Chain Product Tree,但是在此比賽中是簡化版,已建比賽資料,彈性非常低。
  • utility.h, utility.c: 一些通用工具,包括產生讀檔檔名。


事實上此次程式不甚完備,不過時間有限,但是我自己目前尚無時間修改,所以就容許我這樣子偷懶釋出吧XD

---
歡迎自由取用,轉載不需告知

Matrix Chain Product Tree with Parallel Modify

事實上整個程式和簡報參照

Heejo Lee, Jong Kim, Sungje Hong, Sunggu Lee, "Processor Allocation and Task Scheduling of Matrix Chain Products on Parallel Systems, " IEEE Transactions on Parallel and Distributed Systems vol.14 no.4, pp. 394-407, April 2003.

相關資料如下


---
歡迎自由取用,轉載不需告知

MPI Programming & MPI_Group

MPI 本身是message passing interface,是一個專門為平行運算所規範的Library interface,目前較有名的實作體有Open Source的MPICH,而幾個cluster的大廠IBM, hp 也有各自的implemenatation,不過稍微查一下,在天瓏並沒有中文書籍說明相關MPI,而英文書籍也不多,在這個比賽中,我並沒有使用任一英文教科書,我使用的書如下

  • MPI 1.1: 這份文件是Standard,所幸並不難讀,我的MPI_Group就是利用Standard和老師的協助完成學習的。MPI 1.1支援C和Fotran
  • C語言平行計算程式設計: 此份文件極具參考價值,一開始看這份會有很大的幫助,雖然在後面二維陣列的平行計算切割時,變數定義不明,但仍暇不掩瑜,此份文章由國網人士所撰寫,極具參考價值,當然,此份文件也有Fotran
沒有列出MPI 2.0是一件極遺憾的事,MPI 2支援C, C++, Fortran,支援超過500個function,也支援一些更好的平行運算特性,不過在此次的比賽中國網主機是不支援的,所以並沒有特別去研究,不過大概看了一下,有很多向下相容的function,在C++中只是多了一層包裝去呼叫C所實作的function。

MPI_Group是一個極為有趣的function series ,雖然MPI支援針對所有的CPU進行集體通訊的動作,但是若將母群體的CPU分割成數個子群體進行類集體通訊的動作,卻得依靠MPI_Group_xxx 等的function來進行子群體的定義。

一些相關function如下
MPI_Group_size()取得目前這個Group共分得幾顆CPU
MPI_Group_rank()取得目前這顆CPU在此Group的編號
MPI_Comm_Group()建立一個Group
MPI_Group_incl()從一個Group中選取一些CPU建立一個sub-group,而被選取的CPU 仍在原來的Group
MPI_Group_excl()從一個Group中選取一些CPU建立一個sub-group,而被選取的CPU不在原來的Group
MPI_Group_free()針對此Group的CPU做釋放動作,但是同時此CPU也不再屬於任何一個Group,只屬於MPI_COMM_WORLD
MPI_Comm_create()針對某一個Group(MPI_Group),建立一個Communcator(MPI_Comm)
當然,這邊只是提起一些function,還有一些很有趣的Group相關動作,例如說可以針對兩個Group做AND, OR, XOR,還有比較,再提起兩個常數
  • MPI_COMM_NULL: 用於Commucator為NULL的狀況
  • MPI_GROUP_NULL: 此CPU不屬於此Group,即會傳回NULL


範例使用方法

MPI_Group universalSet, subset; /* 宣告母群體和子群體Group */
MPI_Comm universalComm, subComm; /* 宣告母群體和子群體Communcator */

/* 設置母群體 */
MPI_Comm_group(MPI_COMM_WORLD, &universalSet);
MPI_Comm_create(MPI_COMM_WORLD, universalSet, &universalComm);

/* 設置子群體 */
int ranks[] = {0, 1, ,2, 3};
MPI_Group_incl(universalSet, 4, ranks, &subset); /* 設置完後,此4顆cpu仍在原來母群體中 */
MPI_Comm_create(universalComm, subset, &subComm);

/* 針對子群體的集體通訊動作範例 */
int a, subID;
MPI_Group_rank(subset, &subID);
if(subID==0) a = 5;
if(subComm!=MPI_COMM_NULL) MPI_Bcast((void*)&a, 1, MPI_INT, subComm); /* boardcast a 資料給subset這個子群體 */

當然,還有很多很有趣的使用方法,不過我比賽中所使用的技巧僅此而已,呵呵,有錯誤歡迎指教嘍。

---
歡迎自由取用,轉載不需告知

星期一, 10月 08, 2007

how to save a life

經過兩天的休養(睡著的時間比醒著的時間多),一餐吃下兩餐的份量(我有偉大的老媽),比賽後的身體調養算是告一段落了XD

下一步,如果聽了Josh Ko的建議,這將會是無敵大的計畫XD