Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
การอบรมเบองตน
Supercomputing Contest 2009
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
~linux
34
• การใชสญลกษณ 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 rwx
User 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 AUser A
Host BUser B
Host CUser 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
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>23 /* My First C program which prints "Hello world" */45 int main(int argc, char * argv[])6 {7 printf("Hello world !\n");8 return 0;9 }
1 #include <stdio.h>23 /* My First C program which prints "Hello world" */45 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 ป
ดบล
อกของโปรแกรม ‘}’
1 ใช
ไ ลบราร
อ
นพ
ท เอ
าต
พ
ทมาตรฐาน
3 การทา คอมเมนต เพ
ออธ
บายโ
ปรแกรม
5 ฟ
งก
ช
นหล
ก main เป
นฟ
งก
ช
นแรกท
โ ปรแกรมเร
มทา งา
น
โดยส
งค
า 0 ให
ก
บระบบ
6 เป
ดบล
อกของโปรแกรม ‘{’
7 ให
คอมพ
วเตอร
เข
ยน Hello world ออกทางจอภาพ
8 ส
งค
า 0 ให
ก
บระบบ
9 ป
ดบล
อกของโปรแกรม ‘}’
ซอรสโคด
คาอธบาย
เปดคมอเพอเขยนโปรแกรม
70
1 #include <stdio.h>23 /* My First C program which prints "Hello world" */45 int main(int argc, char * argv[])6 {7 printf("Hello world !\n");8 return 0;9 }
1 #include <stdio.h>23 /* My First C program which prints "Hello world" */45 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_world
Hello world
real 0m0.001suser 0m0.000ssys 0m0.001s[somsak_sr@gcc
tmp]$
[somsak_sr@gcc
tmp]$ time ./hello_world
Hello 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
88
คลสเตอร แบงไดเปน• High Performance Cluster
– เนนสมรรถนะหรอความเรว– Parallel programming
• High Throughput Computing– เนนปรมาณงานโดยรวม ใชทรพยากรใหเกดประโยชนสงสด– อาจใชวธ cycle‐stealing
• High Availability Cluster– เนนความทนทานตอความผดพลาดของระบบ– มกใชอปกรณซาๆกนหลายๆตว ทาหนาทเดยวกน
89
Demise of Mainframes, Supercomputers, & MPPs
คลสเตอรคอมพวเตอร
90
Serial computing
Front‐endFront‐end
Compute 0Compute 0 Compute 1Compute 1 Compute nCompute n…RAMRAM
B CA
RAMRAM RAMRAM
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
• คอมไพลโปรแกรม
• รนโปรแกรม
• ผลการรนโปรแกรมstartstartstartstartMPI_Init OKProcess 0 is waiting for greeting messages at pluto.cp.eng.chula.ac.thGreetings 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 OKMPI_Init OKMPI_Init OK
mpicc –o greetings greetings.c
mpirun –np 4 greetings
111
• เราสามารถกาหนดเครองทจะรนโปรแกรมได โดยสราง machine file ขนมา ทจะระบชอเครองตางๆ
– machines
• รนโปรแกรมโดยระบ machine file น ดวย –machinefile <machine file>
compute-0-0compute-0-1compute-0-2
mpirun –np 6 -machinefile machines greetings
112
• ผลลพธทได[user1@pluto mpi]$ mpirun -np 6 -machinefile machines greetingsstartstartstartstartstartstartMPI_Init OKProcess 0 is waiting for greeting messages at pluto.cp.eng.chula.ac.thGreetings 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 OKMPI_Init OKMPI_Init OKMPI_Init OKMPI_Init OK
เปนเครองทระบใน machine file
ตามลาดบ
113
การเขยนโปรแกรม MPI
114
• Rank– ทกๆโปรเซสจะไดรบหมายเลขประจาตว (Rank) หมายเลขหนง ซงจะเรมตนทหมายเลข
0 เสมอ Rank จะใชงานในการระบตนทางและปลายทาง ของการรบสง message ระหวางโปรเซส
• Group และ Communicator
– กลมของโปรเซส โดยทกลมของโปรเซสจะเชอมโยงกบ Communicator ซงเปน ตวอางองสาหรบการทางานแบบเปนกลม โดยคาเรมตนของโปรแกรม MPI นน ทกๆ โปรเซสจะอยในกลมทชอวา MPI_COMM_WORLD กอนเสมอ
115
1 2
3 4MPI_COMM_WORLD0
• โปรแกรม 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
4111
02
π=
+∫ 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/shdateecho “Hello world”
141
• ขนตอนการเขยนสครปตงานเพอสงไปยงระบบจดลาดบงาน SGE– เปดโปรแกรมเขยนขอความ เชน vi, nano, pico เปนตน– เขยนสครปตงานตามทตองการ– บนทกขอมลใหนามสกลเปน .sh หรอ .job– สงงานไประบบจดลาดบงาน SGE ดวยคาสง qsub– ตรวจสอบสถานะการทางานดวยคาสง qstat
142
• เปดโปรแกรมเขยนขอความ
• เขยนสครปตงาน
• บนทก
#!/bin/shdateecho “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.shYour 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.o3249Mon Oct 22 13:18:55 ICT 2007Hello world[user1@frontend-0 ~]$ cat simplejob.sh.e3249[user1@frontend-0 ~]$
145
• เปดโปรแกรมเขยนขอความ
• เขยนสครปตงาน
• บนทก
[userl @frontend-0 ~]$ nano simplejob2.sh
#!/bin/shdateecho “sleep 10000 seconds”sleep 10000
146
• สงงานไปยงระบบจดลาดบงาน SGE ดวยคาสง qsub
• ตรวจสอบสถานะการทางานดวยคาสง qstat
• สถานะ “qw” หมายถงงานรอการประมวลผลอยทควประมวลผล ซงระบบ จดลาดบงาน SGE กาลงหาเครองประมวลผลใหกบงานอย
[userl @frontend-0 userl]$ qsub simplejob2.sh
[userl @frontend-0 ~]$ qsub simplejob2.shYour job 3250 ("simplejob2.sh") has been submitted[userl @frontend-0 ~]$ qstatjob-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 ~]$ qstatjob-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 ~]$ qstatjob-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 3255userl has registered the job 3255 for deletion[userl @frontend-0 ~]$
[userl @frontend-0 ~]$ qstatjob-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.shYour job 3257 ("advancejob.sh") has been submitted[userl @frontend-0 myproject]$ lsadvancejob.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.o3257This is advance jobJob 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 ~]$ ไมเจอโปรแกรม myprog
153
• ปกตระบบจดลาดบงาน 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]$ lsadvancejob.err advancejob.out advancejob.sh myprog myprog.c[userl@frontend-0 myproject]$ cat advancejob.outThis is advance jobJob argument is arg1 arg2 arg3arg 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 3259modified hold of job 3259[user1@frontend-0 myproject]$ qstatjob-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]$ qstatjob-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/gnuexport MPIAPP=greetings
$MPICH_HOME/bin/mpirun -np $NSLOTS -machinefile $TMPDIR/machines $MPIAPP
160
จบการนาเสนอ
161