สรุป Function MPI ที่อบรมมา
posted on 21 Jun 2009 19:29 by mix5003 in Computerข้อมูลที่เป็นสีแดงคือ ไม่แน่ใจ
Rank
ทุกๆโปรเซสจะได้รับหมายเลขประจำตัว (Rank) หมายเลขหนึ่ง ซึ่งจะเริ่มต้นที่หมายเลข 0 เสมอ Rank จะใช้งานในการระบุต้นทางและปลายทาง ของการรับส่ง message ระหว่างโปรเซส
Group และ Communicator
กลุ่มของโปรเซส โดยที่กลุ่มของโปรเซสจะเชื่อมโยงกับ Communicator ซึ่งเป็น ตัวอ้างอิงสำหรับการทำงานแบบเป็นกลุ่ม โดยค่าเริ่มต้นของโปรแกรม MPI นั้น ทุกๆ โปรเซสจะอยู่ในกลุ่มที่ชื่อว่า MPI_COMM_WORLD ก่อนเสมอ
Datatypes
- MPI_INT (Integer)
- MPI_DOUBLE_PRECISION (Double)
- MPI_DOUBLE (?)
Tag
Tag นั้นจะคล้ายๆกับ Port ต้องตรงกันถึงจะส่งถึงกันได้ หรือถ้าจะรับได้ทุก tag ให้ใช้ MPI_ANY_TAG
Function ต่างๆ
MPI_Init(int *argc, char **argv);
เริ่มการทำงานของโปรแกรม MPI
Comment: ไอ้ตัวแปร 2 ตัวนั้นใส่ไปทำเบือกไรฟร่ะ
MPI_Finalize();
จบการทำงานของโปรแกรม MPI
MPI_Comm_size(comm,&size);
บอกว่ามีจำนวนเครื่องที่สามารถใช้งานได้เท่าไหร่ โดย Return ออกมาที่ size ใน Group ที่กำหนด
MPI_Comm_rank(comm,pid);
อ่านค่าของ Rank ปัจจุบันของโปรเซสปัจจุบัน โดยส่งค่า Rank ของ Group นั้น ส่งออกทาง pid
MPI_Send (start, count, datatype, dest, tag, comm);
- start คือ ตัวแปรที่จะส่ง ต้องเป็น Array หากไม่ใช่ Array และเป็นตัวเลข ต้องมี & อยู่ข้างหน้าชื่อตัวแปร เช่น &a
- count คือขนาดของตัวแปรที่จะส่งไป โดยถ้าเป็น Array 1 มิตินั้น คือจะส่งจะนวนช่องของ Array เท่ากับ count เช่น a มีขนาด 10 แล้ว count = 5 จะส่งแค่ตัวแปร a ตั้งแต่ 0-4 ไปให้ผู้รับ หากตัวแปรไม่ใช่ Array ค่าต้องเป็น 1 เท่านั้น
- datatype ย้อนไปดูข้างบนดิ
- dest คือเครื่องเป้าหมายที่จะส่งไป
- tag กลับไปดูดิ ข้างบนอ่ะ
- comm ดูข้างบนดิ ตรง Group อ่ะ ตัวเดียวกัน
- start คือ ตัวแปรที่ใช้สำหรับเก็บค่าที่รับเข้ามาหากไม่ใช่ Array ต้องมี & ด้วย เหมือน MPI_Send
- count คือ ขนาดของตัวแปรที่จะรับเข้ามา เหมือน MPI_Send
- datatype ย้อนไปดูข้างบนดิ
- source คือจะรับค่าจากตัวไหนเท่านั้น หากรับจากตัวใดก็ได้ให้ใช้ MPI_ANY_SOURCE
- tag กลับไปดูดิ ข้างบนอ่ะ
- comm ดูข้างบนดิ ตรง Group อ่ะ ตัวเดียวกัน
- status เอาไว้เก็บค่าสถานะ ของการรับส่งข้อมูล
ข้อควรจำ: ต้องประกาศตัวแปรที่มีชนิดเป็น MPI_Status ไว้เป็นตัว status เสมอ
Comment: ไอ้ตัว status ไม่เห็นเคยใช้ซักที
MPI_Wtime();
- เป็นฟังก์ชันที่ใช้อ่านค่าเวลาปัจจุบัน ของโปรแกรม MPI ทั้ งหมด
- สามารถใช้ในการวัดเวลาที่ใช้ในการประมวลผลของโปรแกรมได้ โดยการเก็บ ค่าของเวลาเริ่มต้น และเวลาสิ้ นสุด แล้วนำมาลบกันเพื่อหาเวลาที่ใช้
- Return ค่าเป็นชนิด Double
- comm นี่กลับไปดู Group
- หยุดรอทุกๆโปรเซส จนกว่าทุกๆโปรเซสใน comm จะเรียกฟังก์ชันน ี้ จนครบหมด
- ใช้เพื่อจะ Synchronize การทำงานของโปรแกรม
Comment: ถ้าใช้ไม่ได้ซวยไป ไม่ได้ฟังวิธีใช้มา 555+
MPI_Bcast(void * buf, int count, MPI_Datatype type, int root, MPI_Comm comm);
- กระจายข้อมูลจากใน buf จากโปรเซสเดียว (ระบุโดย root) ไปยังทุกโปรเซสใน comm
- buf น่าจะเป็นตัวแปร ที่เก็บข้อมูลที่จะใช้ส่งไปให้ตัวอื่นๆ
- count คือขนาดของ Buf ล่ะมั้ง
- Datatype ดูด้านบนอีกล่ะ
- root คือ rank ของเครื่องที่รับข้อมูลที่ประมวลผลเสร็จแล้ว
- comm ดู Group อีกอ่ะ
ตัวอย่างการใช้ MPI_Bcast(buff,100,MPI_Float,0,MPI_COMM_WORLD);
หมายเหตุ: ทุกๆโปรเซสจะเรียกฟังก์ชัน MPI_Bcast เพื่อกระจายข้อมูล โดยโปรเซสที่ระบ ุโดย root เท่านั้นที่จะทำหน้าที่รับข้อมูล
MPI_Gather( void * sendbuf, int sendcnt, MPI_Datatype sendtype, void * recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
- รวบรวมข้อมูลจากทุกๆโปรเซสมารวมกันที่โปรเซสเดียว ซึ่งระบุโดยตัวแปร root
- sendbuf คือข้อมูลที่จะส่งออกไปให้กับ Rank อื่นๆ
- sendcnt ขนาดของตัวที่ส่ง
- recvbuf รับค่ามาเก็บไว้ที่ตัวแปรนี้
- recvcount ขนาดของตัวที่รับ
- Datatype ดูด้านบนอีกล่ะ
- root คือ rank ของเครื่องที่รับข้อมูลที่ประมวลผลเสร็จแล้ว
- comm ดู Group อีกอ่ะ
ตัวอย่างการใช้งาน MPI_Gather( buf, 2, MPI_INT, outbuf, 6 ,MPI_INT,0,MPI_COMM_WORLD);
หมายเหตุ: ทุกๆโป รเซสจะเรียกฟังก์ชัน MPI_Gather เพื่อรวบรวมข้อมูล โดยโปรเซสที่ระบุโดย root เท่านั้ นที่จะทำหน้าที่รับข้อมูล
MPI_Scatter(void * sendbuf, int sendcnt, MPI_Datatype sendtype, void * recvbuf, int recvcnt, MPI_Datatype recvtype, int root, MPI_Comm comm)
- กระจายข้อมูลไปยังทุกๆโปรเซส โดยผู้กระจายจะระบุโดยตัวแปร root
- sendbuf คือข้อมูลที่จะส่งออกไปให้กับ Rank อื่นๆ
- sendcnt ขนาดของตัวที่ส่ง
- Sendtypeน่าจะเป็น ชนิดของ Datatype ที่ใช้ส่งไป
- recvbuf รับค่ามาเก็บไว้ที่ตัวแปรนี้
- recvcnt ขนาดของตัวที่รับ
- recvtype น่าจะเป็น ชนิดของ Datatype ที่รับมา
- root คือ rank ของเครื่องที่รับข้อมูลที่ประมวลผลเสร็จแล้ว (ล่ะมั้ง)
- comm ดู Group อีกอ่ะ
หมายเหตุ: ทุกๆโปรเซสจะเรียกฟังก์ชัน MPI_Scatter เพื่อ รวบรวมข้อมูล โดยโปรเซสที่ระบุโดย root เท่านั้นที่จะทำหน้าท ี่กระจายข้อมูล
MPI_reduce(void * sndbuf, void * rcvbuf, int count, MPI_Datatype type, MPI_Op operation, int root, MPI_Comm comm)
- ทำ operation ที่กำหนดบนข้อมูลใน sndbuf ของทุกๆโปรเซส และ นำมารวมกันที่โปรเซสเดียว
- sndbuf คือตัวแปรที่รับค่าเข้ามาเพื่อเอาไปประมวลผล
- rcvbuf คือผลลัพธ์ที่ได้หลังจากการ Operation แล้ว
- count จำนวนค่าที่เอาหลังจาก Operation แล้ว เช่น นำ 3 ค่าออกมา
- Datatype ดูด้านบนอีกล่ะ
- Operation ที่สนับสนุน
- MPI_MAX หาค่าสูงสุด
- MPI_MIN หาค่าต่ำสุด
- MPI_SUM หาค่ารวม
- MPI_PROD Product
- MPI_LAND Logical And
- MPI_LOR Logical or
- MPI_LXOR Logical Exclusive Or
- MPI_BAND Bitwise And
- MPI_BOR Bitwise Or
- MPI_BXOR ไม่รู้Bitwish exclusive or
- root คือ rank ของเครื่องที่รับข้อมูลที่ประมวลผลเสร็จแล้ว (ล่ะมั้ง)
- comm ดู Group อีกอ่ะ
MPI_Allreduce(void * sndbuf, void * rcvbuf, int count, MPI_Datatype type, MPI_Op operation, int root, MPI_Comm comm)
- ให้ผลเหมือนกับ MPI_Reduce แต่จะมีการส่งค่าผลลัพธ์กลับไปยังทุกๆ โปรเซสด้วย
- ข้อมูลต่างๆดูที่ MPI_Reduce
edit @ 27 Jun 2009 16:33:29 by MIX