สรุป 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 อ่ะ ตัวเดียวกัน
MPI_Recv(start, count, datatype, source, tag, comm, status);
  • 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
MPI_Barrier(MPI_comm comm);
  • 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_Reduce( inbuf, outbuf, 2, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD);

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

Comment

Comment:

Tweet

เหวยยยย ทำไมมันเยอะเงี้ย -"-

#1 By ♦ ziitun ♦ on 2010-05-06 15:30