2013年8月21日 星期三

MPI基本函式介紹

MPI_Init (ierr)
啟動 MPI,所有 MPI 指令之前要有這個初始化指令,唯一個引數是必須宣告成整數的 ierr,如果初始化成功,則 ierr 的傳回值是零。

MPI_Finalize (ierr)
關閉 MPI,結束多個 CPU 協同工作的狀態。正常關閉的話則整數 ierr 的回傳值是零。

MPI_Comm_rank (communicator, my_rank, ierr)
獲得此 CPU 在全體多 CPU 中的排行順序,排名的編號會存在整數變數 my_rank 裏(從零開始),每個參與的 CPU 都會分到一個連號但不重覆的數字(像到郵局辦事領號碼牌那樣)。communicator 是在選通訊裝置,一般都是用預設的 MPI_COMM_WORLD 不用自己改(參見範例),至於 ierr 則是和前面一種作為錯誤或正常的旗標。

MPI_Comm_size (communicator, nproc, ierr)
獲得全體有多少個 CPU 的數目(通常用於切割工作份量的基礎),整數變數 nproc 回傳給每一個 CPU 同樣的數值,即共有多少個 CPU 正在一起工作。ierr 是錯誤回傳檢查用,communicator 的定義與用法跟前面的定義一樣。

MPI_Send (buf, count, datatype, dest, tag, communicator, ierr)
送出(由現在這個 CPU 送出一串資料給另一個 CPU),buf 是指要傳送的那一串資料變數的名稱(也就是第一筆資的位址),count 是資料的長度(從前面定的起點開始算起),datatype 是要被傳送之資料的數值型態,只有幾種常見的固定類型,如 MPI_REAL、MPI_INTEGER 等;整數 dest 是要傳的目的地 CPU 的 rank 編號,至於 整數 tag 則是寫程式的人自已設定的標籤。標籤的功能在這裏可以說明一下,當來源端 CPU 發送資料時,送出來的資料未必會被目的地 CPU 收到相同名稱的變數裏,有可能不止送一包資料,也有可能到達的先後順序會打亂,因此一定要利用標簽來設定每一包資料串有精準被接收到。
MPI_Send 指令是一個阻擋性 (blocking) 的指令,也就是說它要等到收到它在等待的東西才會釋放控制權給主程式去執行下一個指令。

MPI_Recv (buf, count, datatype, source, tag, communicator, status, ierr)
接收。其中前三個引數 buf、count、datatype 與前面定義一樣,souce 是來源 CPU 的編號,tag 則是要與送方指令相同的整數值,作為接收的認證。隨後的 communicator 與 ierr 與前面同。值得注意是 status ,它是用來表示接收的狀態。接收與送出有一點點不同,送出是可以立即動作的,然而接收就並不是下了接收指令就可以馬上進行完成,因為總是要等待資料到達。

MPI_Bcast(buf,n,mpi_datatype,i_src_node,MPI_COMM_WORLD,ierr)
廣播 (Broadcast),意指一個 CPU 放送資料出來,其他 CPU 接收,共同取得該比資料的內容。欲傳送資料的啟始位置是 buf 、長度(資料筆數)是 n 、 i_src_node 是 發送源 之 CPU 編號,其他 mpi_datatype 、MPI_COMM_WORLD、ierr 則是與前面的定義的一樣

MPI_Reduce(buf,result,n,mpi_datatype,mpi_op_type,i_trgt_node, MPI_COMM_WORLD,ierr)
收集各個 CPU 上的結果。其中 mpi_op_type 可以是 MPI_SUM 或 MPI_PRODUCT, 而結果則收集到 i_trgt_node 的 result 變數上(並不是每個 node 的 result 都更新)。

MPI_Get_processor_name (nodename,nchar,ierr)
nodename 是字串變數,它會回傳該 CPU 所在的機器名稱; nchar 是整數,回傳 nodename 內含的字元數

資料來源:

2013年8月19日 星期一

Message Passing Interface

Message Passing Interface (MPI) is a standardized and portable message-passing system designed by a group of researchers from academia and industry to function on a wide variety of parallel computers. The standard defines the syntax and semantics of a core of library routines useful to a wide range of users writing portable message-passing programs. We can use it for creating programmes for distributed computing systems (parallel computing).

MPI特點:
  1. 所有的節點(node,為一台電腦)串接在一起,各自有獨立的記憶體及CPU。
  2. 各節點間會透過互相傳遞訊息來了解彼此的進度。

  3. MPI是利用C語言或Fortran等程式的命令,達到節點間的接收訊息與傳達訊息。

Install MPI environment for you ubuntu
sudo apt-get install libcr-dev mpich2 mpich2-doc

MPI Hello Wrold example

/* C Example */
#include <mpi.h>
#include <stdio.h>
 
int main (int argc, char* argv[])
{
  int rank, size;
 
  MPI_Init (&argc, &argv);      /* starts MPI */
  MPI_Comm_rank (MPI_COMM_WORLD, &rank);        /* get current process id */
  MPI_Comm_size (MPI_COMM_WORLD, &size);        /* get number of processes */
  printf( "Hello world from process %d of %d\n", rank, size );
  MPI_Finalize();
  return 0;
}

mpicc mpi_hello.c -o hello
mpirun -np 2 ./hello

不過有點奇怪, 我目前在我的ubuntu上跑這個code, size回傳居然是1@@
這個部份要再研究一下.
MPI tutorial

資料來源:
http://jetcracker.wordpress.com/2012/03/01/how-to-install-mpi-in-ubuntu/

2013年8月6日 星期二

化學元素週期表




我是氫,我最輕,火箭靠我運衛星;
我是氦,我無賴,得失電子我最菜;
我是鋰,密度低,遇水遇酸把泡起;
我是鈹,耍賴皮,雖是金屬難電離;
我是硼,有點紅,論起電子我很窮;
我是碳,反應慢,既能成鏈又成環;
我是氮,我阻燃,加氫可以合成氨;
我是氧,不用想,離開我就憋得慌;
我是氟,最惡毒,搶個電子就滿足;
我是氖,也不賴,通電紅光放出來;
我是鈉,脾氣大,遇酸遇水就火大;
我是鎂,最愛美,攝影煙花放光輝;
我是鋁,常溫裡,濃硫酸裡把澡洗;
我是硅,色黑灰,信息元件把我堆;
我是磷,害人精,劇毒列表有我名;
我是硫,來歷久,沉澱金屬最拿手;
我是氯,色黃綠,金屬電子我搶去;
我是氬,活性差,霓虹紫光我來發;
我是鉀,把火加,超氧化物來當家;
我是鈣,身體愛,骨頭牙齒我都在;
我是鈦,過渡來,航天飛機我來蓋;
我是鉻,正六鉻,酒精過來變綠色;
我是錳,價態多,七氧化物爆炸猛;
我是鐵,用途廣,不鏽鋼喊我叫爺;
我是銅,色紫紅,投入硝酸氣棕紅;
我是砷,顏色深,三價元素奪你魂;
我是溴,揮發臭,液態非金我來秀;
我是銣,鹼金屬,沾水煙花鉀不如;
我是碘,昇華煙,遇到澱粉藍點點;
我是銫,金黃色,入水爆炸容器破;
我是鎢,高溫度,其他金屬早嗚呼;
我是金,很穩定,扔進王水影無形;
我是汞,有劇毒,液態金屬我為獨;
我是鈾,濃縮後,造原子彈我最牛;
我是鎵,易融化,沸點很高難蒸發;
我是銦,軟如金,輕微放射宜小心;
我是鉈,能脫髮,投毒出名看清華;
我是鍺,可晶格,紅外窗口能當殼;
我是硒,補人體,口服液裡有玄機;
我是鉛,能儲電,子彈頭裡也出現;



我不知道來源, 有人知道的話麻煩跟我說一聲!

一個小故事讓我們明白資金流通的意義

“又是炎熱小鎮慵懶的一天。太陽高掛,街道無人,每個人都債台高築,靠信用度日。這時,從外地來了一位有錢的旅客,他進了一家旅館,拿出一張1000 元鈔票放在櫃檯,說想先看看房間,挑一間合適的過夜,就在此人上樓的時候---- 店主抓了這張1000 元鈔,跑到隔壁屠戶那裡支付了他欠的肉錢...