การอบรมเบองตนSupercomputing Contest
2010
1
จดท าโดยศนยไทยกรดแหงชาต
ส านกงานสงเสรมอตสาหกรรมซอฟตแวรแหงชาต
2
• วนท 1– ลนกซเบองตน
– การเขยนโปรแกรมภาษา C บนลนกซ– แนะน าเทคโนโลยระบบคลสเตอร
• วนท 2– หลกการของโปรแกรมแบบขนาน และ MPI
– ตวอยางของโปรแกรม MPI
3
ลนกสเบองตน
4
• ลนกสท างานแบบไคลเอนต/เซรฟเวอร
– ผใชตองท าการลอคอนเพอเขาใชงาน
– ผใชจ าเปนตองม Username และ Password
• ลนกสจ าแนกผใชเปน 2 กลมหลกคอ
– ผใชทวไป (User)
– ผดแลระบบ (Root)
5
• ปจจบนนยมใชงานโปรแกรมในกลม SSH Client เพอเขาใชงานระบบ Linux ผานทางไกล
• การท างานอยในรปแบบของ text-base และใชงานคอมมานดไลนเปนหลก
• ตวอยางโปรแกรม SSH Client ทใชงานไดฟรบนวนโดวส
• โปรแกรม Putty
• ส าหรบการใชเชลลผาน SSL (Secure Socket Layer) หรอเรยกวา SSH (Secure SHell)
• โปรแกรม WinSCP
• ส าหรบรบสงไฟลระหวางลนกสและวนโดวสผาน SFTP โปรโตคอล
6
• โปรแกรม PuTTy อยบนวนโดวส
7
การเรยกใชงานลนกซดวยโปรแกรม Putty (ตอ)
• กรอกชอเครอง หรอหมายเลข IP ของเครอง
• สามารถ Save Profile ดวยการก าหนดชอ และ Save
8
• โปรแกรมจะ save SSH keys ใหท าการกด Yes
– SSH Key เปนกระบวนการเพอยนยนตวตนของเครอง server เพอปองกนการใชงานเครองทไมถกตอง
• จะปรากฏหนาจอใหท าการ กรอก Username & Password
9
• สงผานไฟลดวยโปรแกรม WinSCP
– การสงผานไฟลในสมยกอนนยมการสงผานดวยโปรแกรม FTP แตเนองจากโปรแกรม FTP มจดออน เรองการรกษาความปลอดภย และสามารถโดนHack ไดงาย (เปลยนไปใช sftp – secure ftp )
– โปรแกรม WinSCP เปนการสงไฟลผานมาตรฐานของระบบ Secure shell ซงมการเขารหสขอมล และมระบบปองกนการโจมตทด
– สามารถโหลดไดท http://winscp.net/eng/index.php
10
การใชโปรแกรม WinSCP
1. กรอก Host name
2. กรอก User name
3. กรอก Password
11
การใชโปรแกรม WinSCP
• โปรแกรมจะท าการเชอมตอไปยงเครองเซรฟเวอร
• ในการเชอมตอครงแรก โปรแกรมจะถามถงการยอมรบ Keys ของเซรฟเวอรวาเชอถอ และจดเกบ keys หรอไม
12
13
• เทอรมนล(Terminal)- คอชองทางทอนญาตใหผใชลอกอนเขาสเคอรเนลทงแบบโลคอลและแบบรโมท
• เชลล(Shell)- คอสวนของลนกสจะใชส าหรบสงอนพทจากผใชไปยเคอรเนล- ลนกสสวนใหญมกใช BASH Shell (Bourne Again Shell) เปนเชลลปรยาย (Default shell)
• เคอรเนล(Kernel)- คอหวใจหลกของระบบท าหนาทตดตอไปยงฮารดแวร
• ลนกสอนญาตใหมหลายเทอรมนลได โดยแตละเทอรมนลมเชลลเปนของตนเอง
14
• ลนกสอนญาตใหมหลายเทอรมนลได โดยแตละเทอรมนลมเชลลเปนของตนเอง
15
“ ลนกสเปนระบบปฏบตการทนยมใชการท างานแบบ text mode เปนหลก (ท างานไดเรว)
“ ในการเรยกใชค าสงจะเปนการเรยกชอค าสง (command) และ options ซงเรยกวา ‚flags‛
“ ซง Commands จะปอนเขาสระบบผาน command prompt“ ในระบบลนกส, จะตองค านงถงตวเลก-ตวใหญของตวอกษร“ บนคอมมานดไลนเดยวกนสามารถเขยนค าสงไดมากกวาหนงค าสง โดยใช ; กนระหวางค าสง
16
[prompt]$ <command> <flags> <args>
user01@local$ ls –l -a unix-tutorial
Command Prompt Command (Optional) flags (Optional) arguments
17
ระบบไฟลบนลนกสและค าสงเบองตน
18
• ระบบไฟลบนวนโดวส
– Windows XP, Windows VISTA
• Support FAT32, NTFS
• File system of BSD Family OS
– FFS (Fast File System)
19
20
คณลกษณะ ระบบปฏบตการวนโดวส ระบบปฏบตการลนกส
ระบบไฟล NTFS, FAT ext2, ext3
การอางองรทของพารทชน C:, D:, F:แตละพารทชนเปนรท
แตละพารทชนอยภายใตรทโหนด (“/”)
• แบงออกเปน 2 ประเภทคอ
– Linux Swap
• ส าหรบท าหนาทเปน Virtual Memory
– Linux File System
• ท าหนาทจดเกบไฟลขอมล
• ระบบไฟลทนยมใชกนมากในปจจบนคอ ระบบไฟล ext3
21
22
ไดเรกทอร ค าอธบาย
/ เกบไดเรกทอรทงหมด และไมเกบไฟลอนๆ
/boot เกบเคอรเนลและไฟลทใหส าหรบบตลนกส
/home เกบขอมลของผใชทงหมด
/usr เกบค าสงระบบและยทลตตาง
/usr/local ส าหรบซอฟตแวรทอาจตดตงเพมเตม
/opt ส าหรบซอฟตแวรทอาจตดตงเพมเตม
/var เกบขอมลของลอกไฟลตางๆ และ Spools
/tmp เกบไฟลชวคราวทสรางขนโดยโปรแกรมตางๆ
23
เปรยบเทยบระหวางลนกสและวนโดวส
โครงสรางไดเรกทอรของลนกส
• ไดเรกทอร : ใชส าหรบการเกบ และจดระเบยบไฟลขอมลหรอไดเรกทอรยอย และอยในรปของตนไม
• เสนทางแบบสมบรณ (Absolute pathname) : ชอของเสนทาง(Path) จากรทไดเรกทอร(/) ไปยงไฟลหรอไดเรกทอรปลายทาง
• รทไดเรกทอร(Root) : ชนสงสดของไดเรกทอร– จะใชสญลกษณในการอางองเปน “/”
24
• โครงสรางของไฟลในระบบยนกส
25
/root
• โฮมไดเรกทอร(/home) : ผใชหนงคนจะมไดเรกทอรนเพยงหนงไดเรกทอร และไมซ ากน
• ค าสงแสดงไดเรกทอรขณะใชงาน และแสดงแบบสมบรณ คอ “pwd” (print working directory)โดยเสนทางแบบสมบรณนจะอางอง ต าแหนงตนไมของโครงสรางไดเรกทอร
• ค าสงเปลยนไดเรกทอร “cd” (change directory) เปลยนไดเรกทอรไปยงไดเรกทอรทตองการ ณ ต าแหนงตนไมของโครงสรางไดเรกทอร
• ~ (metacharacter) จะอางองถงโฮมไดเรกทอร เชน “cd ~”
• Relative pathname คอการอางองต าแหนงของไฟลหรอไดเรกทอร ทอยบนไดเรกทอรขณะใชงาน ใช “./”
26
• “ TAB-completion ” เราสามารถใชแทบ (ป ม TAB) เพอแสดง (หรอเพมเตม) ชอค าสง หรอไฟล หรอไดเรกทอรใหสมบรณ – แสดงค าสงของระบบทเกยวของและผใชสามารถใชงานได– สามารถแสดงชอไฟลทถกอางองในไดเรกทอรนนๆ– แสดงตวแปรสภาพแวดลอมการใชงานขณะนนได ($XXX)– เปนคณลกษณะพเศษของ Bash Shell
27
• Text File คอ ไฟลทสามารถอานได อยในรปแบบของตวอกษร• Binary Data File คอ ไฟลทอยในรปแบบทโปรแกรมสามารถอานไดเทานน
• Executable Program File คอ ไฟลทสามารถท างานได• Directory File คอ ไฟลทแสดงรายละเอยดของไดเรกทอร
28
• Linked File คอไฟลทเปนตวชไปยงไฟลอน• Special Device File คอไฟลทแสดงรายละเอยดของอปกรณ• Named Pipes คอไฟลทระบชองการสงขอมลระหวางโปรแกรม(โปรเซส) ในเครองเดยวกน
• Socket Files คอไฟลทอนญาตใหโปรแกรม(โปรเซส)บนเครองคอมพวเตอรอนสามารถเขยนไฟลลงในเครองได
29
30
• ไฟลทขนตนดวย “.” (จด) เปนไฟลหรอไดเรกทอรทถกซอน• หากสทธของรายการใดขนตนดวย ‘d’ เชน ‘drwxrw-r--’ หมายถงรายการดงกลาวคอไดเรกทอร
• หากสทธของรายการใดขนตนดวย ‘l’ เชน ‘lrwxrwxrwx’ หมายถง รายการดงกลาวเปน Linked File
หมายเหต :• ไฟลการปรบแตงโปรแกรม(Configuration File) มกเปนไฟลทซอนเอาไว
• ค าสง ‘ls -a’ เปนค าสงทสามารถดไดทงไฟลปรกตและไฟลทถกซอน
“ ค าสง ‚pwd‛” แสดงต าแหนงไดเรกทรอรปจจบน
“ ค าสง ‚mkdir directory‛” ค าสงส าหรบสราง ไดเรกทรอร
“ ค าสง ‚rmdir [-option] directory‛” ค าสงส าหรบลบไดเรกทรอร (เงอนไข ตองไมมไฟลขอมลอยในไดเรกทรอรนน)
” -f, ไมแสดงขอผดพลาดหรอค าเตอน
31
“ ค าสง ‚cp [-option] source_file destination_file‛” ค าสงส าหรบท าส าเนาไฟล โดยจะท าส าเนาจากไฟลตนทาง ไปยงไฟลปลายทางทก าหนด
” -f, ไมแสดงขอผดพลาดหรอค าเตอน” -R, ท าการสรางส าเนาทกไฟล และทกไดเรกทรอร” -p, ท าการคงสทธของผใชไวเหมอนเดม” -i, แสดงพรอมพเพอยนยนในกรณเขยนไฟลทบ
32
“ ค าสง ‚mv [-option] source destination‛” เปนค าสงส าหรบยาย ไฟลหรอไดเรกทรอรจากตนทางไปยงปลายทาง
– -i, ใหแสดงการยนยนในกรณเขยนทบไฟลเดม“ ค าสง ‚rm [-option] file
” เปนค าสงในการลบไฟล หรอไดเรกทรอรทตองการออกจากระบบ
– -R, ท าการลบทกไฟล และทกไดเรกทรอรยอย
33
“ ค าสง ‚cd [directory]‛ ” ค าสงส าหรบการเปลยนต าแหนงของไดเรกทรอร
” ตวอยางเชน
“ cd /usr/local“ cd ..“ cd ../../etc/“ cd, กลบไปยงดฟอลไดเรกทรอร (user directory)
“ cd ~linux34
• การใชสญลกษณ wildcard
• ls
• ls *.doc
• ls c???
• ls file?.*
35
• ค าสง “more *filename+”
– เปนการแสดงขอมลภายในไฟล แบบทละบรรทด
• ค าสง “less *filename+”
– เปนค าสงแสดงขอมลภายในไฟล สามารถเลอนขน/ลงเพอแสดงผลได
• ค าสง “cat *filename+”
– เปนค าสงแสดงขอมลภายในไฟลทงหมด
36
“ ค าสง ‚head [-n] [filename]‛ ” แสดงขอมลสวนตนของไฟลทก าหนด ดวยจ านวนบรรทด n
“ ค าสง ‚tail [-n] [filename]‛” แสดงขอมลสวนทายของไฟลทก าหนด ดวยจ านวนบรรทด n” มกใชดลอกไฟลขณะทโปรแกรมท างาน โดยใช ‘tail ”f’
37
• ค าสง “ls -option”
• ls เปนค าสงส าหรบแสดงไฟล และไดเรกทรอร– Option
• -a, เปนการแสดงไฟลขอมลทกไฟล รวมทงไฟลทซอน• -l, แสดงรายละเอยดของไฟล• -R, แสดงขอมลภายในของแตละไดเรกทรอร• -c, เรยงล าดบการปรบแกขอมล• -h, แสดงขนาดของไฟลในรปแบบ KB, MB หรอ GB
38
• ค าสงในการ mount file
– mount –t type device target-dir• type ex. ext3, …• device ex. /dev/hda1, /dev/hdb1, …• target-dir ex. /, /var, /home,
/mnt/cdrom, …
39
/
/var /home
hda3
hda4hda1
40
• ใชค าสง “mount”
• ตวอยางแสดงดงภาพ
• ตวอยางการ mount อปกรณตอพวงตางๆ เชน– CD-ROM
• #mount /dev/cdrom /mnt
– Floppy Disk
• #mount /dev/floppy /mnt
– USB drive, Thumb drive
• #mount /dev/sdb1 /mnt• โดยปรกตลนกตจะมองเหน Thumb drive เปน
sd(a,b,c) โดยขนกบดสกทตดตงอยในระบบ41
• ใชค าสง umount
– umount directory
– umount device
• ตวอยางเชน
– umount /var
– umount /hda1
42
• ระบบจดเกบไวในไฟล /etc/fstab
• ตวอยางขอมลภายในไฟล fstab
43
• ระบบยนกสมการก าหนดสทธไว 3 กลมคอ
– เจาของ (ผใช)
– กลมเดยวกบผใช
– บคคลทวไป
• ซงทกๆไฟล และไดเรกทรอรจ าเปนตองมการบนทกการเขาถงไวตงแตเรมสรางไฟล และมการปรบเปลยนสทธในกรณทมการแกไข และคงไวจนกวาไฟลนนจะถกลบ
44
rwx rwx rwxUser Group Other
– r = Read Permission
– w = Write Permission
– x = Execute Permission
• ในการเปลยนสทธใชค าสง “chmod number filename”
– ตวเลขสามารถหาไดจากการค านวณคา r, w, x ซงมคาดงน
– r = 4 (22)
– w = 2 (21)
– x = 1 (20)
– - = 0 45
“ ตวอยาง
” rwx = 7” rw- = 6” r-x = 5
“ rwxr-xr-x = 755“ rw-rw-rw- = 666“ rwxrwx--- = 770
46
• การเปลยน permission ท าโดย– $ mkdir public_html
– $ chmod 755 publich_html
– $ ls
• การเปลยน permission แบบสมพทธ ชนดก าหนด ผใช ‘u’, กลม‘g’, หรอบคคลอน ‘o’.
– u = owner, g = group, o = other
– + = add permission, - = remove permission
• ค าสง chmod –R จะเปลยนสทธทงไฟลและไดเรกทอรยอย (Recursive)
47
Person Permission Add/remove
u = owner r = read + add
g = group w = write - remove
o = other x = execute
a = u+g+o
48
“ rw-r--r-- change to rw-rw-r--– $ chmod g+w test
“ rw-r--r-- change to rwxrwxr-x– $ chmod ug+wx, o+x test
“ rwxrwxr-x change to rwxr--r--– $ chmod go-wx test
49
• การเปลยนชอเจาของไฟลหรอไดเรกทรอร ท าโดย– $ chown [username].[groupname] [option] files
– option
• -R, เปลยนเจาของในไดเรกทรอรยอยดวย
• -f, ไมแสดงขอผดพลาด– $ chown user test.txt
– $ chown test.test homework.c
– $ chown test:test test.txt
– $ chown user1.group1 -R /home/
50
• Tar เปนค าสงในการรวมไฟล หรอไดเรกทรอร ใหรวมเปนไฟลเพยงไฟลเดยว โดยมขนาดรวมคงเดม (ไมมการบบอด)
• ค าสง– tar [option] outputfile.tar Directory(file1 file2…)
– option• c, สรางไฟล• v, แสดงการท างาน• x, การแยกไฟล• t, แสดงไฟลภายใน• f, ระบวาใหสรางไฟลแทนการพมพผลรวมออกทางหนาจอ
51
• ตวอยางการใชงาน
– $ tar cvf test.tar /home/test
– $ tar tvf test.tar
– $ tar xvf test.tar
52
• ค าสงส าหรบการบบอดไฟล Zip
– zip, unzip : ส าหรบไฟล MS window’s format.
– Gzip, gunzip : ส าหรบไฟล UNIX’s format
– bzip2, bunzip2 : วธการบบอดระดบสง
• ตวอยาง (การบบอดจ าเปนตองท าการ tar กอน)– $ tar cvf test.tar test ; gzip test.tar
– $ tar cvfz test.tar.gz test
– ผลลพธทง 2 ค าสงไดผลเหมอนกน, ‘test.tar.gz’.
53
• ค าสงส าหรบการสงไฟลหรอไดเรกทอร ‘ scp ’ $ scp [-option] <source> <destination>
$ scp [-option] [user@host:/path/] [user@host:/path/]
54
Host A
User A
Host B
User B
Host C
User C
[userA@HostA]$ scp –r userB@hostB:/home/userB/send/ userC@hostC:/home/userC/
userB@hostB‟s password:
userC@hostC‟s password:
• การเปลยนรหสผานควรท าทกๆ 3 เดอน
• รหสผานควรประกอบดวยตวเลขและตวอกษรอนๆ ผสมกน
• ค าสงส าหรบเปลยนรหสผาน– ‘ passwd ’
55
• ลนกสมค าสงมากมาย• มคมอการใชงานแตละค าสง(Manual pages) มกถกตดตงมาพรอมกบการตดตงลนกส– จะใชค าสง “man” แลวตามดวยค าสงลนกสทตองการ– เชน “man ls”– คมอมหลายประเภท
• ค าสงบนลนกสมกเตรยมการชวยเหลอเบองตน เชน “ls --help”
• ลนกสยงมคมอหรอ Information Page เปนคมออยางงาย– ใชค าสง “info” แลวตามดวยค าสงลนกสทตองการ
56
• บนลนกซม text editor เปนจ านวนมาก– VI – text editor พนฐานบนระบบ UNIX มความยดหยนสงมาก แตใชงานคอนขางยาก
– Emacs – text editor ทเปนทนยมในการเขยนโปรแกรมและการเขยนเอกสาร ใชงานคอนขางยาก
– Nano – text editor อยางงายบนลนกซ
57
58
• เรยกใชงาน nano ไดโดยการพมพค าสง “nano”
• ค าสงพนฐาน– การพมพและแกไขขอความ
• สามารถพมพและแกไขขอความไดทนท
– การเซฟไฟล• กด Ctrl+O เพอเซฟไฟล และระบชอไฟลทจะเซฟ
– การออกจากโปรแกรม• กด Ctrl+X เพอออกจากโปรแกรม
59
60
การเซฟและออก
การเซฟ การออก
• สามารถกด Ctrl+X เพออกจาก NANO ไดทนท
• หากยงไมไดเซฟไฟล จะมค าเตอนเพอใหเซฟไฟลกอน
61
กด Ctrl+O และระบชอไฟล
เปดไฟลทเคยสรางไวแลว
62
การเขยนโปรแกรมภาษา C บนลนกซ
63
ภาษา นามสกล ตวอยาง
C++
C
C#
Perl
PHP
Java
.c
.cpp
.cs
.pl
.php
.java
hello.c
hello.cpp
hello.cs
hello.pl
hello.php
hello.java
• โปรแกรมทเขยนขนมา ไมวาจะเขยนโดยใชอดเตอรอะไรกตาม จะไดซอรสโคด (source code) ซงจะเกบในรปแฟมขอมล ซงจะมนามสกลแตกตางกนไปดงน
64
ขอตรวจสอบดกอน
Main(){
printf(“XX”);printf(“YY”);}
ซอรสโคด
กระบวนการแปลโปรแกรม
มขอผดพลาด ไปแกไขมาใหม
ถกตองผานได
ตวแปลภาษา (Compiler)
65
สงซอรสโคดใหกบตวแปลภาษา
ตวแปลภาษา
Executable
File
ไฟลทสามารถรนได
ผลทได
“ เมอเขยนโปรแกรมเสรจ ผานการแปลภาษาแลวผลทไดกจะเปนไฟลโปรแกรมทสามารถน าไปใชไดเลย โดยอาจกอปปลงดสกไปเปดทเครองอนๆ ได ซงจะเปนไฟลโปรแกรมแยกจากตวซอรสโคดทเราเขยน
“ ไฟลโปรแกรมทไดนนเปนไฟลแบบเลขฐานสอง หรอไบนารไฟล (.exe) เรยกวาเอกซควเทเบลไฟล(executable file) หรอ binary file
66
• โปรแกรมภาษา C ใชค าสง gcc
– gcc mainfile.c• โปรแกรมภาษา fortran ใชค าสง , gfortran หรอ ifort
– ifort file.f90• โปรแกรมไบนารจะถกบนทกในไฟลชอ “a.out” (By default)หรอสามารถก าหนดชอโปรแกรมเพอใชในการรน(Executable File)
• การรนโปรแกรมใหน าหนาดวยเครองหมาย “./”
• เชน ./a.out
67
“ ภาษา C เปนภาษาทไดรบความนยมมากในการพฒนาโปรแกรม
“ ค าเตอน” ตองระมดระวงในการเขยนโคด เนองจากเขยนผดพลาดไดงาย” สราง bugs ส าหรบโปรแกรมไดงาย
“ แตเปนภาษาททรงประสทธภาพมาก” ท างานไดรวดเรวมาก” สามารถท างานระดบลางไดด” มค าสงทตรงไปตรงมา ไมซบซอน
68
ตวอยางของโปรแกรมภาษาซ
69
1 #include <stdio.h>
2
3 /* My First C program which prints "Hello world" */
4
5 int main(int argc, char * argv[])
6 {
7 printf("Hello world !\n");
8 return 0;
9 }
1 ใชไลบรารอนพทเอาตพทมาตรฐาน3 การท าคอมเมนตเพออธบายโปรแกรม5 ฟงกชนหลก main เปนฟงกชนแรกทโปรแกรมเรมท างานโดยสงคา 0 ใหกบระบบ6 เปดบลอกของโปรแกรม „{‟7 ใหคอมพวเตอรเขยน Hello world ออกทางจอภาพ8 สงคา 0 ใหกบระบบ9 ปดบลอกของโปรแกรม „}‟
ซอรสโคด
ค าอธบาย
เปดคมอเพอเขยนโปรแกรม
70
1 #include <stdio.h>
2
3 /* My First C program which prints "Hello world" */
4
5 int main(int argc, char * argv[])
6 {
7 printf("Hello world !\n");
8 return 0;
9 }
ซอรสโคด
• ใช ‘ man stdio.h’
• ใช ‘man 2 printf’
• คมอทเกยวของกบการใชงานไลบรารตางๆมกอยทหมายเลข 2 และ 3
#include<stdio.h>
void main()
{
char name[15]; // String Arrayint age;
printf(“What is your name ?\n”);
scanf(“%s”, name);
printf(“Enter year of your Age: ”);
scanf(“%d”,&age);
printf(“Hello %s, your Age is %d\n”, name ,age);
}
71
“ สรางขนเพอความสะดวกสะบายในการเขยนโปรแกรมและคอมไพลโปรแกรม
“ บรรจค าสงเชนเดยวกบเชลลสครปต“ ตรวจสอบการแกไขซอรสไฟล (up-to-date)“ เปนเครองมอทจ าเปนในการพฒนาโปรแกรมบนลนกสและยนกส“ ไมตองท างานแบบล าดบเชนเดยวกบเชลลสครปต“ ใชเลเบลเพออางองการท างาน“ ใชค าสง ‘ make ’ เพอรนเมคไฟล
72
การสรางและใชงานเมคไฟล (ตอ)
73
• COMPILER=/usr/bin/gcc เปนการประกาศตวแปร• อางองตวแปรดวย $(<variable_name>) เชน $(COMPILER)• ค าสง ‘ make ’ จะเรมท างานทเลเบลแรก ในทนคอ ‘make’• สามารถขามไปท างาน ณ ต าแหนงเลเบลทตองการเชน ‘ $ make clean ’• เลเบลมกตามดวยอนพทของค าสงทใชภายใตเลเบลนน และใช ‘ $< ’ เพออางอง
• สรางโปรแกรม Hello world ดวยภาษาซ และบนทกชอเปน test.c ดงน
74
“ เขยน Makefile โดยใชคอมไพเลอรเปน gcc “ ก าหนดออปเจกตไฟลเปน test.o และรนโปรแกรมในชอ launch“ สรางเลเบลส าหรบลบไฟลทเคยคอมไพล ดงน
75
“ ท าการคอมไพลโปรแกรม Hello world โดยใช Makefile “ Makefile ทสรางขนจะตองไมคอมไพล test.c ซ า ดงรป“ ทดลองใช ‘ make clean’ แลวคอมไพลใหม
76
• การจบเวลาอยางงาย สามารถท าไดโดยใชค าสง time ในการจบเวลาการประมวลผล
[somsak_sr@gcc tmp]$ time ./hello_worldHello world
real 0m0.001suser 0m0.000ssys 0m0.001s[somsak_sr@gcc tmp]$
Real – เวลาโดยรวมทงหมดทใชในการประมวลผลUser – เวลาทใชในการประมวลผลSystem – เวลาทใชในการตดตอกบระบบ (เชน การอานเขยนไฟล การพมพขอความ)
77
แนะน าเทคโนโลยระบบคลสเตอร
78
• “การค านวณแกปญหาทมขนาดใหญและมความซบซอนมาก โดยใชคอมพวเตอรทมความสามารถสงทสดเทาทมในเวลานน”– “ปญหาทมขนาดใหญและซบซอน”
– “คอมพวเตอรทมความสามารถสงทสด”
– “เทาทมในเวลานน”
79
• ขนาด (Size): ปญหาทนกวทยาศาสตร หรอวศวกรไมสามารถแกไดดวยคอมพวเตอรพซ ตวอยางเชนปญหาทตองการหนวยความจ าขนาดใหญ หรอหนวยจดเกบขอมลขนาดหลายกกะไบต
• ความเรว (Speed): ปญหาทนกวทยาศาสตร หรอวศวกร ตองใชระยะเวลาทนานมากๆ ในการทจะไดมาซงค าตอบ ดวยการค านวณบนเครองคอมพวเตอรสวนบคคล (PC) ในขณะทใชระยะเวลาการค านวณไมกชวโมงบนเครอง ซเปอรคอมพวเตอร (Supercomputer)
80
ปญหาทมขนาดใหญและซบซอน
81
• ปญหาทมความซบซอนมากขนาดทคอมพวเตอรทดทสดในเวลานนไมสามารถแกปญหาไดในเวลาอนเหมาะสม
• กลมปญหา Grand Challenge จะเปลยนไปเรอยๆ เมอคอมพวเตอรพฒนาขน• ตวอยางปญหาทาทายคอมพวเตอร
– Weather Forecast
– Computer Animation
– Molecular simulation
– Bioinformatics
– etc
82
• ท าไดโดยการจ าลองการเปลยนแปลงของบรรยากาศ ณ เวลาหนงโดยค านวณทละ time step
• ตวอยางการค านวณ– พนทขนาด 36 X 36 ตร.กม. แบงเปนตารางขนาด 136 x 112 จ านวน 33 ชน รวมเปน
503,000 สวน พยากรณลวงหนา 24 ชม. โดยแบงเปน 1067 time step จะตองใชการค านวณทงหมด 2,558,666 Mflop หรอ 2.56 TeraFlop
– ป 2000 ใชเครอง Pentium III 500 MHz (99 Mflop/s) ใชเวลา 7.11 ชม.• ใชคลสเตอรจ านวน 64 เครอง ไดในเวลา 20 นาท
– ป 2004 ใชเครอง Xeon 2.8 GHz dual processor (991 Mflop/s) ใชเวลา 42.68 นาท
• รวมเปนคลสเตอรขนาด 120 เครอง ใชเวลา 66 วนาท เทานน !!
83
Less fish …
More fish!
• การท างานเชงขนาน (Parallelism)คอการท างานหลายๆอยางในเวลาเดยวกน ท าใหท างานไดเสรจมากกวาในเวลาทเทากน
84
• 1960- 1980s แนวคดทางทฤษฎเกดขนมากมาย
• 1962 CDC 1604 ซเปอรคอมพวเตอรเปนเครองแรก
• 1975 Cray-1 (80 MHz) ซเปอรคอมพวเตอรเครองแรกทผลตเพอจ าหนาย
• 1975-1990 มนวตกรรมคอมพวเตอรแบบขนานจ านวนมาก มงานวจยและผผลตจ านวนมาก Cray X MP, Cray Y MP, Cray-2
85
• 1990 บรษทผผลตหลายรายเลกกจการไป
• 1994 เบวลฟคลสเตอร (Beowolf cluster) เกดขน
• ปจจบน SMP (Symmetric Multiprocessor) และคลสเตอรคอสถาปตยกรรมหลก
• คอมพวเตอรในปจจบนเรมน าแนวคดแบบขนานมาใช
86
• ถอก าเนดในป 1994
• โดยนาย Donald Becker จาก NASA ท าการประกอบคอมพวเตอร คลสเตอรตวแรกของโลก ประกอบดวย 16 เครอง DX4 PCs ระบบเครอขายเปน 10 Mb/s Ethernet
• เรยกระบบนวา เบวลฟคลสเตอร (Beowulf cluster)
• สรางจากอปกรณทหาไดทวไป (commercial off-the-shelf hardware) เชน คอมพวเตอรระดบพซ (PC) หรอสถานงาน (workstation) และอเทอรเนตสวตช (ethernet switch)
• ตวอยางโปรแกรม เชน data mining, simulations, parallel
processing, weather modeling, computer graphical rendering, etc. 87
Front-end
Compute-0
Compute-1
Compute-2
Compute-3
88
คลสเตอร แบงไดเปน• High Performance Cluster
– เนนสมรรถนะหรอความเรว– Parallel programming
• High Throughput Computing– เนนปรมาณงานโดยรวม ใชทรพยากรใหเกดประโยชนสงสด– อาจใชวธ cycle-stealing
• High Availability Cluster– เนนความทนทานตอความผดพลาดของระบบ– มกใชอปกรณซ าๆกนหลายๆตว ท าหนาทเดยวกน
89
Demise of Mainframes, Supercomputers, & MPPs
คลสเตอรคอมพวเตอร
90
Serial computing
Front-end
Compute 0 Compute 1 Compute n…RAM
B CA
RAM RAM
D
91
Parallel computing
Front-end
Compute 0 Compute 1 Compute n…
A
RAM RAM RAM
A AA
A AA
92
• ขนตอนใชงานระบบคลสเตอรมดงน– Log-in เขาใชงานระบบผานโปรแกรม Putty
– เขยนโปรแกรม– คอมไพลเปนไบนารไฟล– สงใหโปรแกรมท างาน– ตรวจสอบผล– ตดตามการท างานของโปรแกรม
93
• ในระบบคลสเตอร ทมผใชหลายคน จ าเปนตองมการจดล าดบการใชงานทรพยากร
• โปรแกรมทท าหนาทจดการเรยกวา โปรแกรมจดล าดบงาน (Job Scheduler)– SUN Grid Engine
– PBS/Torque, LSF, Condor, Moab
• ท าไมตองม?– เพอก าหนดสทธ และล าดบขนของการท างาน เพอใหเกดความเสมอภาค และสามารถใช
ทรพยากรไดคมคาสงสด
94
หลกการของโปรแกรมแบบขนาน
95
• จดประสงคคอการท าใหโปรแกรมท างานไดเรวขน
• งานขนาดใหญสามารถท าใหท างานเรวขนไดโดย– แบงงานใหญเปนงานยอยๆ หลายๆงาน
– สงงานยอยไปท างานยงเครองประมวลผลหลายๆ เครองพรอมกน
– รวบรวมผลทไดจากเครองประมวลผลตางๆ
96
• โดยทวไปจะใชวธการ massage passing
– ลกษณะของ message passing คอ• การใชหนวยประมวลผลพรอมๆกนกบงานชนเดยวกน
• สามารถแลกเปลยนขอมลขณะประมวลผล
• มาตรฐานของการโปรแกรมแบบขนาน– MPI
• ปจจบนเปนเสมอนมาตรฐานส าหรบการเขยนโปรแกรมแบบขนาน
97
• วธการพฒนา– พฒนาโปรแกรมแบบขนานดวยไลบรารของ message passing เชน
MPI, PVM เปนตน ซงปจจบนไลบรารเหลานไดสนบสนนภาษาการเขยนโปรแกรมหลายภาษา เชน C/C++, java เปนตน
– คอมไพลโปรแกรมดวย คอมไพเลอรของโปรแกรมแบบขนาน
– พฒนาโปรแกรมดวยภาษาพเศษส าหรบโปรแกรมแบบขนาน เชน OpenMP, High performance fortan (HPF) เปนตน
98
• อลกอรทมในการแบงโปรแกรมแบบขนาน
– Functional Parallelism• เปนอลกอรทมทใชแบงแตละสวนของฟงกชนออกจากกน โดยสวนทแบงออกมานนจะตองเปนอสระตอกนและไมเกยวของกน แลวน าแตละสวนมาประมวลผลพรอมกน
• ตวอยาง E = A*B + C*D
• A*B และ C*D สามารถประมวลผลพรอมกนได เพราะทงสองสวนนนเมอแบงออกมาแลวจะไมมสวนทเกยวของกน
99
• อลกอรทมในการแบงโปรแกรมแบบขนาน (2)
– Data Parallelism
• เปนอลกอรทมทจะกระจายฟงกชนเดยวกนแตมขอมลขาเขาแตกตางกนไป แลวประมวลผลพรอมกน
• ตวอยาง A[1] = B[1] + C[1]
A[2] = B[2] + C[2]A[N] = B[N] + C[N]
• โดยแตละโปรแกรมจะประมวลผลพรอมๆกน ทงหมดใชหนวยประมวลผล N หนวย
B C
B[1] C[1]
B[2] C[2]
B[n] C[n]
A= +
A[1]
A[2]
A[n]
= +
= +
= +
…
100
• ความสมพนธของขอมล (Data Dependency)
– เกดขนเมอการประมวลผลจ าเปนตองใชขอมลรวมกน
– ตวอยางท 1โปรแกรมท 1 คอ A = B + C, โปรแกรมท 2 คอ D = E + F• ไมมความสมพนธขอมล
– ตวอยางท 2โปรแกรมท 1 คอ A = B + C, โปรแกรมท 2 คอ D = E + A
• มความสมพนธขอมล โดยโปรแกรมท 1 จะตองประมวลผลเสรจกอนทจะเรมประมวลผลโปรแกรมท 2
101
• ความสมพนธของขอมล (Data Dependency)
• ตวอยางท 1– A[i,j] = A[i-1, j] + 1
– A[0,0] A[1,0]
A[0,3]
A[1,3]
A[2,3]
A[3,3]
A[0,2]
A[1,2]
A[2,2]
A[3,2]
A[0,1]
A[1,1]
A[2,1]
A[3,1]
A[0,0]
A[1,0]
A[2,0]
A[3,0]
102
• ความสมพนธของขอมล (Data Dependency)
• ตวอยางท 2– A[i,j] = A[i, j-1] + 2
– A[0,0] A[0,1]
A[0,3]
A[1,3]
A[2,3]
A[3,3]
A[0,2]
A[1,2]
A[2,2]
A[3,2]
A[0,1]
A[1,1]
A[2,1]
A[3,1]
A[0,0]
A[1,0]
A[2,0]
A[3,0]
103
เลอกวธการแบงขอมล
• ความสมพนธของขอมล (Data Dependency)
• ตวอยางท 3– A[i,j] = A[i-1, j] + A[i, j-1]
– A[0,1], A[1,0] A[1,1]
104
• วธการพฒนาโปรแกรมแบบขนาน– เรมตนจากออกแบบโปรแกรมแบบ sequential ซงเปนการโปรแกรมแบบปกตทใชกน
– ตรวจสอบการท างานของโปรแกรมวามสวนใดบางทตองใชเวลาประมวลผลมากกวา เพอทจะพฒนาเปนการประมวลผลแบบขนาน
– เลอกวธการแบงขอมลและแบงงานออก
– เพมการเขยนโปรแกรมลงไปใหเปนโปรแกรมแบบขนาน
105
• MPI คอ Message Passing Interface
• เปนไลบรารส าหรบการตดตอสอสารระหวางหนวยประมวลผลและการแลกเปลยนขอมล
• ใชส าหรบการเขยนโปรแกรมแบบขนาน• ปจจบนไลบรารนไดถกพฒนาขนหลายแบบดงน
– MPICH• เปนไลบรารทไดรบความนยมสงสด
– OpenMPI
106
• ขนตอนการใชงาน mpi
– เขยนโปรแกรมดวยไลบราร mpi
– คอมไพลโปรแกรมดวย คอมไพเลอร mpi โดยจะตองเลอกใหเหมาะกบภาษาทเขยนโปรแกรม
mpif77 mpi_prog.f
mpicc mpi_prog.c
mpif90 mpi_prof.f90
mpiCC mpi_prof.C
107
• ขนตอนการใชงาน mpi (2)
– ระบเครองทสามารถประมวลผลไดใน machine file
– ประมวลผลโปรแกรมดวย mpirun
compute-0-0
compute-0-1
compute-0-2
mpirun –np <number of process> [option] <program>
108
• greetings.c#include <stdio.h>
#include <mpi.h>
main(int argc, char** argv) {
int my_rank; /* Rank of process */
int p; /* Number of processes */
int source; /* Rank of sender */
int dest; /* Rank of receiver */
int tag = 50; /* Tag for messages */
char message[100]; /* Storage for the message */
char name[32]; /* Processor name */
int name_len;
MPI_Status status; /* Return status for receive */
printf("start\n");
MPI_Init(&argc, &argv);
printf("MPI_Init OK\n");
109
• greetings.c (ตอ)MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &p);
MPI_Get_processor_name(name, &name_len);
if (my_rank != 0) {
sprintf(message, "Greetings from process %d at %s!", my_rank, name);
dest = 0;
MPI_Send(message, strlen(message)+1, MPI_CHAR, dest,
tag, MPI_COMM_WORLD);
} else {
printf("Process %d is waiting for greeting messages at %s\n", my_rank,
name);
for (source = 1; source < p; source++) {
MPI_Recv(message, 100, MPI_CHAR, source, tag,
MPI_COMM_WORLD, &status);
printf("%s\n", message);
}
}
MPI_Finalize();
}
110
• คอมไพลโปรแกรม
• รนโปรแกรม
• ผลการรนโปรแกรมstart
start
start
start
MPI_Init OK
Process 0 is waiting for greeting messages at pluto.cp.eng.chula.ac.th
Greetings from process 1 at compute-0-0.local!
Greetings from process 2 at compute-0-1.local!
Greetings from process 3 at compute-0-2.local!
MPI_Init OK
MPI_Init OK
MPI_Init OK
mpicc –o greetings greetings.c
mpirun –np 4 greetings
111
• เราสามารถก าหนดเครองทจะรนโปรแกรมได โดยสราง machine file ขนมา ทจะระบชอเครองตางๆ– machines
• รนโปรแกรมโดยระบ machine file น ดวย –machinefile
<machine file>
compute-0-0
compute-0-1
compute-0-2
mpirun –np 6 -machinefile machines greetings
112
• ผลลพธทได[user1@pluto mpi]$ mpirun -np 6 -machinefile machines greetings
start
start
start
start
start
start
MPI_Init OK
Process 0 is waiting for greeting messages at pluto.cp.eng.chula.ac.th
Greetings from process 1 at compute-0-0.local!
Greetings from process 2 at compute-0-1.local!
Greetings from process 3 at compute-0-2.local!
Greetings from process 4 at compute-0-0.local!
Greetings from process 5 at compute-0-1.local!
MPI_Init OK
MPI_Init OK
MPI_Init OK
MPI_Init OK
MPI_Init OK
เปนเครองทระบใน machine file ตามล าดบ
113
การเขยนโปรแกรม MPI
114
• Rank
– ทกๆโปรเซสจะไดรบหมายเลขประจ าตว (Rank) หมายเลขหนง ซงจะเรมตนทหมายเลข 0 เสมอ Rank จะใชงานในการระบตนทางและปลายทาง ของการรบสง message ระหวางโปรเซส
• Group และ Communicator
– กลมของโปรเซส โดยทกลมของโปรเซสจะเชอมโยงกบ Communicator ซงเปนตวอางองส าหรบการท างานแบบเปนกลม โดยคาเรมตนของโปรแกรม MPI นน ทกๆโปรเซสจะอยในกลมทชอวา MPI_COMM_WORLD กอนเสมอ
115
1 2
34MPI_COMM_WORLD
0
• โปรแกรม MPI จะมการก าหนดชนดของตวแปร (Datatypes) ชนดใหมขนมาทงหมด– ตวแปรพนฐาน เชน MPI_INT (Integer)
MPI_DOUBLE_PRECISION (double)
– ตวแปรประเภท Array
– ตวแปรอนๆทสรางขนภายหลง โดยผใช
• ในการเรยกใชงานฟงกชนของ MPI จะตองมการระบประเภทของตวแปร โดยจะตองใชประเภทของตวแปรทก าหนดโดยมาตรฐาน MPI เสมอ
116
• ในการรบสง message จะสามารก าหนดสงทเรยกวา tag เพอใชในการแยกประเภทของ message แตละสวนได
• ฝงรบสามารถทจะระบ tag ของ message ทตองการรบได หรอจะระบเปน MPI_ANY_TAG เพอรบทกๆ tag กได
117
• การตดตอแบบจดตอจด (point-to-point)
– เปนการสง message ระหวางโปรเซส 2 โปรเซส
• การตดตอแบบเปนกลม (collective)
– เปนการสง message ระหวางกลมของโปรเซส เชน การสงจากจดเดยวไปหลายจด การรบจากหลายจดมาจดเดยว การรบและกระจายขอมล เปนตน
• การตดตอแบบ asynchronous
– เปนการรบสงขอมล โดยไมตองรอใหผ รบ/สง ไดรบขอความกอน– ชวยใหสามารถปรบปรงสมรรถนะของโปรแกรม ใหสามารถประมวลผลไปพรอมๆกบการรบสงขอมลได
118
• MPI มฟงกชนใหใชงานเปนจ านวนมากกวา 129 ฟงกชน แตส าหรบผ เรมตน รเพยง 6 ฟงกชนกสามารถเขยนโปรแกรม MPI ไดแลว
• ฟงกชนทง 6 ไดแก– MPI_INIT(int *argc, char **argv);
• เรมการท างานของโปรแกรม MPI
– MPI_FINALIZE();• จบการท างานของโปรแกรม MPI
– MPI_COMM_SIZE(comm,size);• อานคาจ านวนของโปรเซสทประมวลผลอย
– MPI_COMM_RANK(comm,pid);
• อานคาของ Rank ปจจบนของโปรเซสปจจบน
– MPI_SEND(buf,count,datatype,dest,tag,comm);
– MPI_RECV(buf,count,datatype,source,tag,comm,status);119
#include "mpi.h"
#include <stdio.h>
int main( int argc, char *argv[] )
{
int rank, size;
MPI_Init( &argc, &argv );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
MPI_Comm_size( MPI_COMM_WORLD, &size );
printf( "I am %d of %d\n", rank, size );
MPI_Finalize();
return 0;
}
120
MPI_Send (start, count, datatype, dest, tag, comm)
• ขอมลทจะสงจะระบโดยอาศย (start, count, datatype).
• ปลายทางทจะสง จะระบโดย dest (เปน rank ของปลายทางทจะสงไป)
• tag และ comm ใชระบ tag และกลมทจะสงขอมล• เมอฟงกชนเสรจสนการท างานแลว ขอมลจะถกน าสงไปเพอเตรยมสงไปยงปลายทาง โดยขอมลอาจจะยงไปไมถงปลายทาง
121
MPI_Recv(start, count, datatype, source, tag, comm,
status)
• Start ชไปถงจดเรมตนของ buffer ทจะรบขอมล
• รอจนกวาขอมลทสงมาจาก Rank ทระบโดย Source และ Tag จะมาถง
• หากตองการไมระบทมาของขอความ สามารถระบ source เปน MPI_ANY_SOURCE
• Status จะระบสถานะของการรบขอมล
• Count ใชระบขนาดสงสดของ buffer ทใชพกขอมล
122
• Status เปนตวแปรประเภท MPI_Status ทใชอานขอมลของผสงขอมลint recvd_tag, recvd_from, recvd_count;
MPI_Status status;
MPI_Recv(..., MPI_ANY_SOURCE, MPI_ANY_TAG, ..., &status )
recvd_tag = status.MPI_TAG;
recvd_from = status.MPI_SOURCE;
MPI_Get_count( &status, datatype, &recvd_count );
123
#include <mpi.h>
#include <stdio.h>
double wtime1,wtime2;
int buff[1024]={1,2,3,};
MPI_Status status;
int main(int argc,char **argv)
{
int mysize,myid;
int i;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&mysize);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
124
if ( myid==0 ) {
wtime1=MPI_Wtime();
printf("I am process #%d sending\n",myid);
MPI_Send(buff,100,MPI_INT,1,0,MPI_COMM_WORLD);
printf("I am process #%d receiving\n",myid);
MPI_Recv(buff,1024,MPI_INT,MPI_ANY_SOURCE,0,MPI_COMM_WORLD,&status);
wtime2=MPI_Wtime();
printf("Round Trip Time=%10.4f\n",wtime2-wtime1);
MPI_Finalize();
} else {
printf("I am process #%d receiving\n",myid);
MPI_Recv(buff,1024,MPI_INT,MPI_ANY_SOURCE,0,MPI_COMM_WORLD,&status);
for(i=0;i<3;i++) printf("%d ",buff[i]);
printf("\n");
printf("I am process #%d sending\n",myid);
MPI_Send(buff,100,MPI_INT,0,0,MPI_COMM_WORLD);
MPI_Finalize();
}
}
125
ตวอยางของโปรแกรม MPI
126
• การหาคาของ PI สามารถประมาณไดโดยการใชฟงกชนดงน
• โดยการอนทเกรดคาตามฟงกชนน จาก 0 ไปถง 1 และคณดวย 4
127
41
11
0
2
dxx
• แบงการอนทเกรด ใหเปนการหาพนทใตกราฟดงตวอยาง โดยแบงพนทออกเปนพนทยอยๆหลายๆพนท
• โปรเซสแตละโปรเซสจะค านวณหาพนทในแตละสวน• เมอค านวณหาพนทเสรจแลวจงน ามารวมกนในขนตอนสดทาย
• ในกรณน จะเหนไดวายงแบงยอยพนท (เพมจ านวนโปรเซส) มากขน กจะไดคา PI ทมความละเอยดสงขน
128
#include <stdio.h>
#include <math.h>
#include <mpi.h>
int main(int argc, char *argv[])
{
int myid, numprocs, i, rc, count;
/* divide graph into 10000000 fragment */
int n = 100000;
double PI25DT = 3.141592653589793238462643;
double mypi, pi, h, sum, x, a;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
h = 1.0 / (double) n;
sum = 0.0;
for (i = myid + 1; i <= n; i += numprocs) {
x = h * ((double)i - 0.5);
sum += 4.0 / (1.0 + x*x);
}
mypi = h * sum;
ตวอยางโปรแกรมหาคา Pi อยางงาย
if(myid != 0) {
// send back data
MPI_Send(&mypi, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
} else {
// gather all data
pi = mypi;
count = 0;
while(count < (numprocs - 1) ) {
MPI_Recv(&mypi, 1, MPI_DOUBLE, MPI_ANY_SOURCE,
0, MPI_COMM_WORLD, NULL);
count++;
pi += mypi;
}
}
if (myid == 0)
printf("pi is approximately %.16f, Error is %.16f\n",
pi, fabs(pi - PI25DT));
MPI_Finalize();
return 0;
}129
เรมการท างาน
ค านวณพนทกราฟสวนยอย
รวมผลลพธการค านวณ
แสดงผลและจบการท างาน
#include <stdio.h>
#include <math.h>
#include <mpi.h>
int main(int argc, char *argv[])
{
int myid, numprocs, i, rc, count;
/* divide graph into 10000000 fragment */
int n = 100000;
double PI25DT = 3.141592653589793238462643;
double mypi, pi, h, sum, x, a;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
h = 1.0 / (double) n;
sum = 0.0;
for (i = myid + 1; i <= n; i += numprocs) {
x = h * ((double)i - 0.5);
sum += 4.0 / (1.0 + x*x);
}
mypi = h * sum;
ตวอยางโปรแกรมหาคา Pi ฉบบปรบปรง
MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0,
MPI_COMM_WORLD);
if (myid == 0)
printf("pi is approximately %.16f, Error is %.16f\n",
pi, fabs(pi - PI25DT));
MPI_Finalize();
return 0;
}
130
เรมการท างาน
ค านวณพนทกราฟสวนยอย
รวมผลลพธการค านวณ
แสดงผลและจบการท างาน
• หาคาของผลลพธในการคณเมตรกซ A และ B
A B
X
double a,b,c;
main(int argc,char *argv[])
{
integer i,j,k;
readfile(a,b);
for( i=0; i < n; i++)
for (j=0; j < n; j++) {
c[i][j]=0;
for(k=0; k < n; k++)
c[i][j] += a[i][k] * b[k][j];
}
writefile( c);
}
• สมมตเราม 4 โปรเซส: P0-P3– ขนท 1: กระจาย B ไปยง
P0-P3
– ขนท 2: สง column ทถกตองไปยง P0-P3
– ขนท 3: ค านวณผลลพธของเมตรกซยอย
– ขนท 4: รวมเมตรกซยอยเขาเปนผลลพธรวม
B
P0
P1
P2P3
A
C
P0
P1
P2P3
โปรแกรมคณเมตรกซแบบขนานโดยใช MPI
/*/* * mmult.c: matrix multiplication using MPI. * There are some simplifications here. The main one
is that matrices B and C * are fully allocated everywhere, even though only a
portion of them is * used by each processor (except for processor 0) */ #include <mpi.h>#include <stdio.h> #define SIZE 400 /* Size of matrices */ int A[SIZE][SIZE], B[SIZE][SIZE], C[SIZE][SIZE]; void fill_matrix(int m[SIZE][SIZE]){static int n=0;int i, j;for (i=0; i<SIZE; i++)for (j=0; j<SIZE; j++)m[i][j] = n++;
}
void print_matrix(int m[SIZE][SIZE]){
int i, j = 0;for (i=0; i<SIZE; i++) {
printf("\n\t| ");for (j=0; j<SIZE; j++)
printf("%2d ", m[i][j]);printf("|");
}}
int main(int argc, char *argv[]){int myrank, P, from, to, i, j, k;int tag = 666; /* any value will do */MPI_Status status;
double t1,t2,t;
MPI_Init (&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &myrank); /* who am i */MPI_Comm_size(MPI_COMM_WORLD, &P); /* number of processors */
if (SIZE%P!=0) {
if (myrank==0) printf("Matrix size not divisible by number of processors\n");
MPI_Finalize();exit(-1);
}from = myrank * SIZE/P;to = (myrank+1) * SIZE/P;
/* Process 0 fills the input matrices and broadcasts them to the rest */ /* (actually, only the relevant stripe of A is sent to each process) */
if (myrank==0) {fill_matrix(A);fill_matrix(B);
}t1 = MPI_Wtime(); MPI_Bcast (B, SIZE*SIZE, MPI_INT, 0, MPI_COMM_WORLD);MPI_Scatter (A, SIZE*SIZE/P, MPI_INT, A[from], SIZE*SIZE/P, MPI_INT, 0,
MPI_COMM_WORLD);
// printf("computing slice %d (from row %d to %d)\n", myrank, from, to-1);for (i=from; i<to; i++) for (j=0; j<SIZE; j++) {C[i][j]=0;for (k=0; k<SIZE; k++)C[i][j] += A[i][k]*B[k][j];
}MPI_Gather (C[from], SIZE*SIZE/P, MPI_INT, C, SIZE*SIZE/P, MPI_INT, 0, MPI_COMM_WORLD);
t2 = MPI_Wtime(); if (myrank==0) printf("%d,%5.2f\n",P,t2-t1);
if (myrank==0) {printf("\n\n"); print_matrix(A); printf("\n\n\t * \n"); print_matrix(B);printf("\n\n\t = \n"); print_matrix(C); printf("\n\n");
}MPI_Finalize();return 0;
}
การสงงานประมวลผลในระบบคลสเตอร
137
Sun Grid Engine (SGE)
• ท าไมตองเรยก “กรด”?
– รองรบการท างานบนทรพยากรหลากหลายชนด อาท compute
server, data collector, visualization terminal..
• SGE คอ โปรแกรมบรหารจดการทรพยากร– รองรบการสงงานจากผใช– จดล าดบการท างานตามเงอนไขทผแล
ก าหนด– รองรบการท างานไดมากกวา 100
งานพรอมกน138
• การบรหารงานใน SGE
• ผใชแตละคนสามารถสงงานไปประมวลผลผานระบบจดล าดบงาน SGE แลวสามารถออกจากระบบไดเลย โดยทไมจ าเปนตองรอใหงานประมวลผลเสรจ
• ระบบจดล าดบงาน SGE จะเลอกเครองประมวลผลเองอตโนมต ตามนโยบายทผดแลเครองก าหนดไว
• ขอมลขาออก(output) และขอมลความผดพลาด(error) ของงานทไปประมวลผลนน จะถกบนทกอยในไฟลขอมลขาออกและขอมลความผดพลาด
139
ค าสง ค าอธบาย
qsub สงงานไปประมวลผล
qstat แสดงสถานะการท างาน
qdel ยกเลกงานทประมวลผล
qhost แสดงเครองประมวลผลทสามารถตดตอไดในขณะน
qalter แกไขคาคณลกษณะของงาน
• ค าสงพนฐานของระบบจดล าดบงาน SGE
140
• การเขยนสครปตงาน เปนการระบโปรแกรมทตองการประมวลผล โดยในสครปตงานหนงอาจจะเรยกใชมากกวา 1 โปรแกรม
• ตวอยางการเขยนสครปตงานเพอทจะสงงานไประบบจดล าดบงาน SGE
#!/bin/sh
date
echo “Hello world”
141
• ขนตอนการเขยนสครปตงานเพอสงไปยงระบบจดล าดบงาน SGE
– เปดโปรแกรมเขยนขอความ เชน vi, nano, pico เปนตน– เขยนสครปตงานตามทตองการ
– บนทกขอมลใหนามสกลเปน .sh หรอ .job
– สงงานไประบบจดล าดบงาน SGE ดวยค าสง qsub
– ตรวจสอบสถานะการท างานดวยค าสง qstat
142
• เปดโปรแกรมเขยนขอความ
• เขยนสครปตงาน
• บนทก
#!/bin/sh
date
echo “Hello world”
[userl @frontend-0 ~]$ vi simplejob.sh
1. Esc
2. Shift + :wq
3. enter
143
• สงงานไปยงระบบจดล าดบงาน SGE ดวยค าสง qsub
• หลงจากสงงานไปแลวระบบจดล าดบงาน SGE จะมอบหมายเลขงาน (Job ID) ซงเอาไวอางองถงงานน เชนถาหากตองการยกเลกการประมวลผลงานนใหใชค าสง qdel พรอม Job ID
[user1@frontend-0 ~]$ qsub simplejob.sh
Your job 3241 (“simplejob.sh") has been submitted
[user1@frontend-0 ~]$
144
• หลงจากทงานไดถกประมวลผลเรยบรอย ขอมลขาออก (output) จะถกบนทกอยในไฟล “simplejob.o<job id>” และขอความผดพลาด (error) จะถกบนทกในไฟล “simplejob.e<job id>”
[user1@frontend-0 ~]$ ls simplejob*
simplejob.sh simplejob.sh.e3249 simplejob.sh.o3249
[user1@frontend-0 ~]$ cat simplejob.sh.o3249
Mon Oct 22 13:18:55 ICT 2007
Hello world
[user1@frontend-0 ~]$ cat simplejob.sh.e3249
[user1@frontend-0 ~]$
145
• เปดโปรแกรมเขยนขอความ
• เขยนสครปตงาน
• บนทก
[userl @frontend-0 ~]$ nano simplejob2.sh
#!/bin/sh
date
echo “sleep 10000 seconds”
sleep 10000
146
• สงงานไปยงระบบจดล าดบงาน SGE ดวยค าสง qsub
• ตรวจสอบสถานะการท างานดวยค าสง qstat
• สถานะ “qw” หมายถงงานรอการประมวลผลอยทควประมวลผล ซงระบบจดล าดบงาน SGE ก าลงหาเครองประมวลผลใหกบงานอย
[userl @frontend-0 userl]$ qsub simplejob2.sh
[userl @frontend-0 ~]$ qsub simplejob2.sh
Your job 3250 ("simplejob2.sh") has been submitted
[userl @frontend-0 ~]$ qstat
job-ID prior name user state submit/start at queue slots ja-task-ID
--------------------------------------------------------------------------------
3250 0.00000 simplejob2 userl qw 10/22/2007 13:24:59 1
[userl @frontend-0 ~]$
147
• ตวอยางท 2 การเขยนสครปตงานเพอสงไปยงระบบจดล าดบงาน SGE
• เมอลองตรวจสอบอกครงหนงดวย qstat พบวาสถานะเปน “t” หมายถง งานก าลงเรมประมวลผล
• เมอสถานะเปน “r” หมายถง งานก าลงประมวลผล
[userl @frontend-0 ~]$ qstat
job-ID prior name user state submit/start at queue slots ja-task-ID
-------------------------------------------------------------------------------
3255 0.55500 simplejob2 userl t 10/22/2007 13:34:55 [email protected] 1
[userl @frontend-0 ~]$ qstat
job-ID prior name user state submit/start at queue slots ja-task-ID
-------------------------------------------------------------------------------
3255 0.55500 simplejob2 userl r 10/22/2007 13:34:55 [email protected] 1
148
ขอมล ค าอธบาย
job id หมายเลขประมวลผล
name ชองาน
user name ชอเจาของงาน
state สถานะการท างาน
queue ควประมวลผลงาน ใน Rocks สวนใหญจะเปนชอเครองลกขาย
• ขอมลทส าคญของการแสดงสถานะ
149
• การยกเลกการประมวลผลงาน
• ตรวจสอบหมายเลขประมวลผลดวยค าสง qstat
• ยกเลกการประมวลผลงานดวยค าสง qdel <job id>[userl @frontend-0 ~]$ qdel 3255
userl has registered the job 3255 for deletion
[userl @frontend-0 ~]$
[userl @frontend-0 ~]$ qstat
job-ID prior name user state submit/start at queue slots ja-task-ID
-------------------------------------------------------------------------------
3255 0.55500 simplejob2 userl t 10/22/2007 13:34:55 [email protected] 1
150
• ตวอยางท 3 การเขยนสครปตงานเพอสงไปยงระบบจดล าดบงาน SGE
• สรางไดเรกทอร “myproject” แลวเขาไปยงไดเรกทอรน
• สรางโปรแกรม “myprog.c” ตามตวอยางตอไปน
[userl@frontend-0 ~]$ mkdir myproject
[userl@frontend-0 ~]$ cd myproject
#include <stdio.h>
int main(int argc, char * argv[]){
if(argc < 2){
return -1;
}
printf("arg 1 is %s\n", argv[1]);
return 0;
}
151
• คอมไพลโปรแกรม “myprog”
• เขยนสครปตงานทชอ “advancejob.sh”
[userl @frontend-0 myproject]$ gcc myprog.c -o myprog
#!/bin/sh
echo "This is advance job"
echo "Job argument is $*"
./myprog $*
152
• สงงานไปยงระบบจดล าดบงาน SGE ดวยค าสง qsub
• ตรวจสอบขอมลขาออก (output) และขอความผดพลาด (error)
[userl @frontend-0 myproject]$ qsub advancejob.sh
[userl @frontend-0 myproject]$ qsub advancejob.sh
Your job 3257 ("advancejob.sh") has been submitted
[userl @frontend-0 myproject]$ ls
advancejob.sh myprog myprog.c
[userl @frontend-0 myproject]$ qstat
[userl @frontend-0 myproject]$ cd ..
[userl @frontend-0 ~]$ ls advancejob*
advancejob.sh advancejob.sh.e3257 advancejob.sh.o3257
[userl @frontend-0 ~]$ cat advancejob.sh.o3257
This is advance job
Job argument is
[userl @frontend-0 ~]$ cat advancejob.sh.e3257
/opt/gridengine/default/spool/compute-0-1/job_scripts/3257: line 6:
./myprog: No such file or directory
[userl @frontend-0 ~]$ ไมเจอโปรแกรม myprog153
• ปกตระบบจดล าดบงาน SGE จะท างานอยบนไดเรกทอร home ของแตละผใช
• ขอมลขาออก (output) และขอมลความผดพลาด (error) จะถกเกบไวทไดเรกทอร home
• เพอทจะประมวลผลงานตวอยางท 3 ได จ าเปนตองก าหนดตวเลอก(option)ของระบบจดล าดบงาน SGE ดงน – -cwd เปนการเปลยนไดเรกทอรทท างานของระบบจดล าดบงาน SGE จากเดมทเปนไดเรกทอร home ใหเปนไดเรกทอรปจจบนทใชค าสง qsub
– -o, -e เปนการระบชอไฟลทเปนขอมลขาออก (output) และขอมลความผดพลาด (error) ใหม
154
• ลองสงงานไประบบจดล าดบงาน SGE ใหมอกครง พรอมกบตวเลอกทตงคาใหมดงน (โดยอารกวเมนต arg1 arg2 arg3 เปนการก าหนดคาตวแปรในโปรแกรม myprog)
• ผลลพธทไดเปนดงน
[userl@frontend-0 myproject]$ qsub -cwd -o ./advancejob.out
-e ./advancejob.err advancejob arg1 arg2 arg3
[userl@frontend-0 myproject]$ ls
advancejob.err advancejob.out advancejob.sh myprog myprog.c
[userl@frontend-0 myproject]$ cat advancejob.out
This is advance job
Job argument is arg1 arg2 arg3
arg 1 is arg1
[userl@frontend-0 myproject]$ cat advancejob.err
[userl@frontend-0 myproject]$
155
• ระหวางทงานรอประมวลผล ผใชสามารถทจะหยดการประมวลผลชวคราว (suspend) เพอใหงานทส าคญกวาแตมาทหลงไดประมวลผลกอนได
• งานทหยดการประมวลผลชวคราวไดนน ตองเปนงานทก าลงรออยในควประมวลผล (มสถานะเปน qw)
156
• หยดการท างานชวคราวดวยค าสง “qhold <job id>”
• ใหงานกลบมาประมวลใหมอกครง ใชค าสง “qrls <job id>”
[user1@frontend-0 myproject]$ qhold 3259
modified hold of job 3259
[user1@frontend-0 myproject]$ qstat
job-ID prior name user state submit/start at queue slots ja-task-ID
-----------------------------------------------------------------------------
3259 0.00000 advancejob user1 hqw 10/22/2007 14:12:07 1
[user1@frontend-0 myproject]$
[user1@frontend-0 myproject]$ qrls 3259
[user1@frontend-0 myproject]$ qstat
job-ID prior name user state submit/start at queue slots ja-task-ID
-----------------------------------------------------------------------------
3259 0.00000 advancejob user1 qw 10/22/2007 14:12:07 1
[user1@frontend-0 myproject]$
157
• ในการเขยนสครปตงานสามารถทจะก าหนดตวเลอกของ SGE ลงไปในสครปตได ดวยการระบ “#$”
#!/bin/sh
#$ -cwd
#$ -j y
#$ -N advancejob
#$ -o ./myprog.out
echo "This is advance job"
echo "Job argument is $*"
./myprog $*
158
• mpirun จะรนโปรแกรมบนโพรเซสเซอรเฉพาะทระบไว ซงอาจจะเพมภาระใหโพรเซสเซอรนนมากเกนไป
• SGE สามารถจดการกบโปรแกรม MPI ซงจะชวยกระจายงานไปยงโพรเซสเซอรตางๆใหเหมาะสม
• ใชค าสง qsub –pe <parallel environment>
<number of processor> <script>
159
• สรางสครปตงานดงน (greetings.sh)
• รนโปรแกรมผาน SGE ดวยค าสง qsub –pe mpich <np> <script>– qsub –pe mpich 5 greetings.sh (ใช 5 processor)– qsub –pe mpich 3-5 greetings.sh (ใช 3 - 5 processor)– qsub –pe mpich -5 greetings.sh (ใชไมเกน 5 processor)– qsub –pe mpich 5- greetings.sh (ใช 5 processor ขนไป)
#!/bin/bash
#$ -cwd
#$ -j y
export MPICH_HOME=/opt/mpich/gnu
export MPIAPP=greetings
$MPICH_HOME/bin/mpirun -np $NSLOTS -machinefile $TMPDIR/machines $MPIAPP
160
จบการน าเสนอ
161
Top Related