Download as pdf or txt
Download as pdf or txt
You are on page 1of 130

ۚྟିѩྛ࠹ෘ

Ӿ࿐ќ ᇏ‫॓ݓ‬࿐ჽ࠹ෘࠏຩ઎ྐ༏ᇏྏ
chi@sccas.cn, chi@sc.cnic.cn

http://lssc.cc.ac.cn/
http://www.sccas.cn/
http://www.scgrid.cn/
http://www.cngrid.org/

2005 ୍ 4 ᄅ 6 ರ
ଢ ੣

ֻ၂҆‫ٳ‬ ѩྛ࠹ෘࠎԤ 3

ֻ၂ᅣ ყСᆩ് 5
§1.1 ѩྛ࠹ෘ֥ଢѓ‫ބ‬ଽಸ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
§1.2 ѩྛ࠹ෘࠏ‫ؿ‬ᅚ৥ӱ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
§1.2.1 ࠹ෘࠏ༢๤‫ؿ‬ᅚࡥൎ . . . . . . . . . . . . . . . . . . . . . . . . . . 6
§1.2.2 ѩྛ࠹ෘࠏ‫ؿ‬ᅚࡥඍ . . . . . . . . . . . . . . . . . . . . . . . . . . 7
§1.3 ଢభൗࢸۚྟି࠹ෘࠏ֥ሑঃ . . . . . . . . . . . . . . . . . . . . . . . . 9
§1.4 ॖঔᅚ֥ѩྛ࠹ෘࠏุ༢ࢲ‫ ܒ‬. . . . . . . . . . . . . . . . . . . . . . . . 11
§1.4.1 ؓӫ‫؟‬ԩ৘ࠏ༢๤ . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
§1.4.2 ‫܋҃ٳ‬ཚթԥԩ৘ࠏ༢๤ . . . . . . . . . . . . . . . . . . . . . . . 13
§1.4.3 նܿଆѩྛ࠹ෘࠏ༢๤ . . . . . . . . . . . . . . . . . . . . . . . . 14
§1.4.4 ࠏಕ༢๤ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
§1.5 ‫ݓ‬ଽຓӑࠩ࠹ෘᇏྏሑঃ . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
§1.5.1 ૅ‫ݓ‬ӑࠩ࠹ෘᇏྏࡥࢺ . . . . . . . . . . . . . . . . . . . . . . . . 16
§1.5.2 ᇏ‫ݓ‬ն੤ӑࠩ࠹ෘᇏྏࡥࢺ . . . . . . . . . . . . . . . . . . . . . . 17

ֻ‫ؽ‬ᅣ ࠎԤѩྛෘ‫م‬ 21
§2.1 ѩྛ࠹ෘࠎЧ‫ ୑ۀ‬. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
§2.2 ѩྛෘ‫م‬ഡ࠹ࠎЧჰᄵ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
§2.3 ౵თ‫ࢳٳ‬ٚ‫ م‬. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
§2.4 ‫ࢳٳିۿ‬ٚ‫ م‬. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
§2.5 ੀඣཌ࠯ඌ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
§2.6 ‫طٳ‬ᇍᆭٚ‫ م‬. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
§2.7 ๝҄ѩྛෘ‫ م‬. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
§2.8 ၳ҄ѩྛෘ‫ م‬. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
§2.9 ቔြ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

ֻ‫ٳ҆ؽ‬ ѩྛෘ‫م‬ഡ࠹აൌགྷ 29

ֻ೘ᅣ इᆔѩྛ࠹ෘ 31
§3.1 ѩྛइᆔӰ‫ م‬. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

i
ii ଢ ੣

§3.1.1 ԱྛइᆔӰ‫ م‬. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32


§3.1.2 ྛਙ߃‫ٳ‬ෘ‫ م‬. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
§3.1.3 ྛྛ߃‫ٳ‬ෘ‫ م‬. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
§3.1.4 ਙਙ߃‫ٳ‬ෘ‫ م‬. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
§3.1.5 ਙྛ߃‫ٳ‬ෘ‫ م‬. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
§3.1.6 Cannon ෘ‫ م‬. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
§3.2 ཌྟսඔٚӱቆѩྛ౰ࢳٚ‫ م‬. . . . . . . . . . . . . . . . . . . . . . . . 36
§3.2.1 ‫҃ٳ‬ൔ༢๤֥ѩྛ LU ‫ࢳٳ‬ෘ‫ م‬. . . . . . . . . . . . . . . . . . . 37
§3.2.2 ೘࢘ٚӱቆ֥ѩྛࢳ‫ م‬. . . . . . . . . . . . . . . . . . . . . . . . 38
§3.3 ؓӫᆞ‫ק‬ཌྟٚӱቆ֥ѩྛࢳ‫ م‬. . . . . . . . . . . . . . . . . . . . . . . 41
§3.3.1 Cholesky ‫ࢳٳ‬ਙ۬ൔ֥ѩྛ࠹ෘ . . . . . . . . . . . . . . . . . . . 41
§3.3.2 ච౷эߐ Cholesky ‫ ࢳٳ‬. . . . . . . . . . . . . . . . . . . . . . . . 42
§3.3.3 ྩᆞ֥ච౷эߐ Cholesky ‫ ࢳٳ‬. . . . . . . . . . . . . . . . . . . . 44
§3.4 ೘ؓ࢘ٚӱቆ֥ѩྛࢳ‫ م‬. . . . . . . . . . . . . . . . . . . . . . . . . . . 46
§3.5 ࣜ‫םׅ‬սෘ‫֥م‬ѩྛ߄ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
§3.5.1 Jacobi ‫ם‬ս‫ م‬. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
§3.5.2 Gauss-Seidel ‫ם‬ս‫ م‬. . . . . . . . . . . . . . . . . . . . . . . . . . 48
§3.6 ၳ҄ѩྛ‫ם‬ս‫ م‬. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
§3.6.1 ၳ҄ѩྛ‫ם‬ս‫ࠎم‬Ԥ . . . . . . . . . . . . . . . . . . . . . . . . . . 49
§3.6.2 ཌྟ‫ם‬ս֥၂Ϯ൬৻ྟࢲ‫ ݔ‬. . . . . . . . . . . . . . . . . . . . . . 50
§3.7 սඔหᆘᆴ໙ี֥ѩྛ౰ࢳ . . . . . . . . . . . . . . . . . . . . . . . . . . 51
§3.7.1 ؓӫ೘ؓ࢘इᆔหᆘᆴ໙ี . . . . . . . . . . . . . . . . . . . . . . 51
§3.7.2 Householder эߐ . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
§3.7.3 ߄ؓӫइᆔູ೘ؓ࢘इᆔ . . . . . . . . . . . . . . . . . . . . . . . 53
§3.8 ቔြ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

ֻ೘҆‫ٳ‬ ѩྛൌགྷ 55

ֻඹᅣ ѩྛӱ྽ഡ࠹ 57
§4.1 ѩྛщӱଆൔ֥ᇶေো྘ . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
§4.2 ѩྛӱ྽֥ࠎЧหׄ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
§4.3 ѩྛӱ྽֥ൌགྷ࠯ඌ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
ଢ ੣ iii

ֻ໴ᅣ ཨ༏Ԯ‫־‬щӱࢤ१ MPI 59


§5.1 MPI ࡥࢺ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
§5.2 MPI ӱ྽ൌ২ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

ֻੂᅣ MPI ѩྛߌ࣢ܵ৘‫ݦ‬ඔ 63

ֻ௾ᅣ MPI ࣉӱ॥ᇅ‫ݦ‬ඔ 65


§7.1 MPI ࣉӱቆҠቔ‫ݦ‬ඔ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
§7.2 MPI ๙ྐሰҠቔ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

ֻϖᅣ MPI ׄ֞ׄ๙ྐ‫ݦ‬ඔ 71


§8.1 ቅೖൔ๙ྐ‫ݦ‬ඔ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
§8.2 ٤ቅೖൔ๙ྐ‫ݦ‬ඔ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
§8.3 ห൹֥ׄ֞ׄ๙ྐ‫ݦ‬ඔ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
§8.4 MPI ֥๙ྐଆൔ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

ֻࣴᅣ MPI Ⴈ޼ሱ‫ק‬ၬ֥ඔऌো྘აյЇ 87


§9.1 Ⴈ޼‫ק‬ၬ֥ඔऌো྘ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
§9.2 MPI ֥ඔऌյЇაҷЇ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

ֻ൅ᅣ MPI ऊ‫ކ‬๙ྐ 97


§10.1 ᅰθ๝҄ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
§10.2 ֆׄა‫ׄ؟‬๙ྐ‫ݦ‬ඔ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
§10.3 ‫ׄ؟‬ა‫ׄ؟‬๙ྐ‫ݦ‬ඔ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

ֻ൅၂ᅣ MPI ಆअ݂ჿҠቔ 107

ֻ൅‫ؽ‬ᅣ HPL ӱ྽ൌ২௩༅ 117

ҕॉ໓ང 119

‫ڸ‬੣၂ ѩྛӱ྽ष‫۽ؿ‬ऎაۚྟିӱ྽९ 121


§A.1 BLASaLAPACKaScaLAPACK . . . . . . . . . . . . . . . . . . . . . . . 121
§A.2 FFTW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
§A.3 PETSc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

‫ڸ‬੣‫ؽ‬ MPI ‫ݦ‬ඔ reference 123


iv ଢ ੣

෬ ႄ 125
࢝࿐ေ౰

1. ࢝࿐ଢ֥ğ ๙‫ھݖ‬ज़ӱ֥࿐༝đ൐๝࿐ૌਔࢳ‫ބ‬ᅧ໤ѩྛ࠹ෘࠏ֥‫ؿ‬ᅚa

ѩྛෘ‫ࠎ֥م‬Ч‫୑ۀ‬aѩྛӱ྽ഡ࠹ٚ‫ބم‬ѩྛൌགྷߌ࣢đູՖ൙ѩྛ࠹

ෘ࿹࣮‫ބ‬൐Ⴈӑࠩ࠹ෘࠏ༢๤‫ࠎק׍‬Ԥb

2. ଽಸࡥࢺğ ࢺകѩྛ࠹ෘࠏ֥‫ؿ‬ᅚđ֒ࣂѩྛ࠹ෘࠏ֥ᇶੀ‫ؿ‬ᅚٚཟĠѩ

ྛ࠹ෘ֥ࠎЧ‫୑ۀ‬đѩྛෘ‫ࠎ֥م‬Чো྘ࠣഡ࠹࠯ඌĠइᆔѩྛ࠹ෘ໙ีđ

ᇗׄࢺകѩྛइᆔӰ‫م‬đཌྟսඔٚӱቆѩྛ౰ࢳٚ‫م‬đսඔหᆘᆴ໙ี

֥ѩྛ౰ࢳđࣜ‫םׅ‬սෘ‫֥م‬ѩྛ߄Ġѩྛӱ྽ഡ࠹࠯ඌđࢺകѩྛӱ྽

֥หׄ‫ބ‬ൌགྷ࠯ඌĠѩྛൌགྷߌ࣢ MPIđࢺക MPI ‫ݖ‬ӱܵ৘‫ݦ‬ඔđᅧ

໤Ⴈ MPI щཿѩྛӱ྽֥ٚ‫م‬ĠMPI ׄؓׄ๙࿟‫ݦ‬ඔđಆअ๙࿟‫ݦ‬ඔđ


ಆअҠቔ‫ݦ‬ඔđࣉӱቆ֥ҠቔĠѩྛӱ྽ൌགྷൌ২đ௩༅इᆔѩྛӰ‫֥م‬

ൌགྷ‫ބ‬౰ࢳٚӱቆ֥ൌགྷb

3. ࠎԤᆩ്ğFORTRAN/C ე࿽đ࠹ෘٚ‫م‬b

4. ҕॉሧਘğӧ‫ݓ‬ਅđѩྛ࠹ෘ - ࢲ‫ܒ‬aෘ‫م‬aщӱđۚ֩࢝ტԛϱഠđ2003
୍ 8 ᄅb

1
2 ଢ ੣
ֻ၂҆‫ٳ‬

ѩྛ࠹ෘࠎԤ
ֻ၂ᅣ ყСᆩ്

§1.1 ѩྛ࠹ෘ֥ଢѓ‫ބ‬ଽಸ
ଢѓğ౰ࢳնܿଆ໙ี‫گބ‬ᄖ༢๤bᄪ௹ѩྛ࠹ෘၛࡆ෎౰ࢳ໙ีູଢ֥đᆃটჷ
Ⴟֆԩ৘ࠏ֥࠹ෘ෎؇൳֞໾৘ഈ֥ཋᇅđܻ෎൞ఃഈཋbෛሢ࠹ෘᄝ॓࿐࿹࣮‫ބ‬ൌ࠽
ႋႨᇏ‫ߨؿ‬ᄀটᄀն֥ቔႨđದૌؓ࠹ෘၘࣜӁളਔ၇ঠđࡼඔᆴଆ୅ቔູྸ‫؟‬थҦ֥
၇ऌbགྷᄝದૌၘࣜ༝ܸࡼ࠹ෘቔູ॓࿐࿹ֻ࣮֥೘ᇕ൭‫؍‬đ‫ބ‬Ԯ๤֥॓࿐࿹࣮֥৘ં
ٚ‫ބم‬ൌဒٚ‫م‬ѩਙb
ሱ 90 ୍սၛটđѩྛ࠹ෘ֤ၛॢభ֥٦෎‫ؿ‬ᅚđ၂ٚ૫đႮႿֆԩ৘ࠏ֥࠹ෘ෎؇
҂؎ิۚđѩྛ࠹ෘࠏุ֥༢ࢲ‫ܒ‬౴ႿӮඃđඔऌԮൻຩ઎֥ѓሙ߄‫ބ‬Ԯൻ෎ੱ֥ն‫ږ‬
ิശđ൐֤ѩྛ࠹ෘࠏ֥࿹ᇅᇛ௹ି‫ܔ‬Ֆ୍ࠫ֞ࠫ۱ᄅđູ࿹ᇅѩྛ࠹ෘࠏ༢๤Էᄯਔ
Ⴕ০่ࡱbਸ਼၂ٚ૫đ๷‫׮‬ѩྛ࠹ෘ‫ؿ‬ᅚ֥ᇶေ‫׮‬৯টሱႿ‫࠽ݓ‬ഈ֥၂ུᇗေ࿹࣮࠹߃
[1, 2]b
ૅ‫ݓ‬HPCC ࠹߃ğ॓࿐‫۽ބ‬ӱ࠹ෘླေି‫ ܂ิܔ‬1TFLOPS ࠹ෘି৯a1TB ଽթಸ
ਈa1TB/s ֥ I/O ջॺđ္ࣼ൞ 3T ྟିଢѓbૅ‫ູݓ‬ਔЌӻఃᄝۚྟି࠹ෘა࠹ෘ
ࠏ๙ྐਵთ֥ਵֹ໊༵đᄝ 1993 ୍đႮ॓࿐a‫۽‬ӱa࠯ඌ৳Ϲླྀ‫ט‬৘൙߶ཟ‫ิ߶ݓ‬
ࢌਔoᇗն็ᅞཛଢğۚྟି࠹ෘა๙ྐp֥Бۡđ္ࣼ൞Фӫູ HPCC ࠹߃֥Б
ۡđࠧૅ‫ݓ‬ሹ๤॓࿐ᅞ੻ཛଢđఃଢ֥൞๙‫఼ࡆݖ‬࿹࣮აष‫ࢳؿ‬थ၂஻ᇗေ֥॓࿐ა
࠯ඌ็ᅞ໙ีb‫ھ‬ཛଢႮඹ҆‫ٳ‬ቆӮğ
1) ۚྟି࠹ෘࠏ༢๤čHPCSĎđଽಸЇওࣂުࠫս࠹ෘࠏ༢๤֥࿹࣮a༢๤ഡ࠹‫۽‬
ऎa༵ࣉ֥‫྘ׅ‬༢๤ࠣჰႵ༢๤֥௟ࡎ֩Ġ
2) ༵ࣉೈࡱ࠯ඌაෘ‫م‬čASTAĎđଽಸႵऍն็ᅞ໙ี֥ೈࡱᆦӪaྍෘ‫م‬ഡ࠹aೈ
ࡱ‫ٳ‬ᆦა‫۽‬ऎa࠹ෘ࠯ඌࠣۚྟି࠹ෘ࿹࣮ᇏྏ֩Ġ
3) ‫॓ࡅݓ‬࿹ა࢝ტຩčNRENĎđଽಸႵᇏࢤᅟࠣ 10 ၡ໊ࠩԮൻ֥࿹࣮აष‫ؿ‬Ġ
4) ࠎЧ࿹࣮აದোሧჷčBRHRĎđଽಸႵࠎԤ࿹࣮a஡࿞a࢝ტࠣज़ӱ࢝ҋb
HPCC ࠹߃ᇏ࣍௹ေࢳथ֥oऍն็ᅞp໙ีႵğ
1) Ո࠺੣࠯ඌbေᄝ၂௜ٚ৐૜֥Ո஍і૫ഈ࿢෪࠺੣ 10 ၡ໊ඔऌĠ
2) ྍူ࿹ᇅbหљ൞ٝᇍδᆡაηሩѨྍူ֥࿹ᇅĠ
3) ۚ෎Ӭ൧ࢌ๙bྍ྘֮ᄮၻ٦ࠏ֥࿹ᇅđॢగ‫׮‬৯࿐֥࠹ෘĠ
4) բ߄࠴ഡ࠹b‫ڿ‬эᇀࣂູᆸ‫؟‬ඔբ߄࠴ौࣜဒഡ࠹֥༝ܸđሇཟ࠹ෘࠏ‫ڣ‬ᇹഡ࠹đ
ᇶေ‫ٳ‬༅ᆃུ‫گ‬ᄖ༢๤֥նܿଆਈሰ߄࿐ଆ྘Ġ
5) ಗਘಗഎჰ৘b๙‫߄ݖ‬࿐‫׮‬৯࿐࠹ෘđࢣൕੀุ৯࿐֥ቔႨđ࿹ᇅྍ྘‫ࠏ׮ؿ‬Ġ
6) ‫ݚ‬လଆ྘ଆ୅bؓ‫ݚ‬လࠃ‫׮‬აնగੀ֥ಣࢌߐࣉྛᆜุ‫ݚ‬လଆ୅Ġ

5
6 ֻ၂ᅣ ყСᆩ്

7) ԙသҪॢ‫׳‬b࿹࣮॥ᇅԙသཨ‫ݖݻ‬ӱ֥߄࿐‫׮ބ‬৯࿐ࠏᇅĠ
8) ඔሳࢳ௩bೂ೘ົ CT ೡ૭๭འԩ৘đದଷᇶีଆ྘đ೘ົള໾ࢲ‫ܒ‬აඹົൈࡗ
ࢲ‫ܒ‬Ġ
9) ॢగ໪ಙb࠹ෘଆ୅ିิ‫܂‬Ⴕི॥ᇅ໪ಙԮѬ֥๯ࣥđࢣൕః໾৘ა߄࿐ࠏ৘Ġ
10) ֑Ϣᇉࢲ‫ܒ‬ഡ࠹b൐Ⴈ࠹ෘࠏଆ୅đ֑ؓϢᇉቆӮ֥೘ົࢲ‫ྛࣉܒ‬࿹࣮Ġ
11) ๭འ৘ࢳbൌൈ߻ᇅ๭འࠇ‫߂׮‬Ġ
12) ૡ઒௥ၲ࠯ඌb௥ၲӉ໊ඔ֥ૡ઒đᇶေ൞࿙ᅳ၂۱նඔ֥ਆ۱෍ၹሰb
ૅ‫ݓ‬ASCI ࠹߃ğಆ૫࣌ᆸ‫ނ‬൫ဒ่ჿద‫ުר‬đؓ‫ނ‬໳ఖ֥࿹ᇅᆺି๙‫ݖ‬ᄝൌဒ൩֥ඔ
ᆴଆ୅টປӮb1996 ୍ 6 ᄅႮૅ‫ିݓ‬ჷ҆ิԛਔoࡆ෎ᅞ੻࠹ෘԷྍp࠹߃đ္ࠧ
ASCI ࠹߃ཛଢbิԛ๙‫ݖ‬ඔᆴଆ୅ট௟‫ނܙ‬໳ఖ֥ྟିaνಆྟaॖौྟa۷ྍ֩b
ေ౰ඔᆴଆ୅ղ֞ۚ‫ٳ‬яੱaۚЯᆇ؇a೘ົaಆ໾৘aಆ༢๤֥ܿଆ‫ିބ‬৯b‫࠹ھ‬
߃Фಪູ൞ა୍֒ણ‫֩߃࠹ؘݗ‬๝֥၂۱ऍն֥็ᅞđ෱҂ࣇླေሱಖ॓࿐ࡅ֥ҕ
აđ‫ླ္౏ط‬ေა࠹ෘࠏ֩‫۽‬ြࢸ֥‫ކ‬ቔđิ‫܂‬Ќᅰ ASCI ࠹߃ᇏ֥ႋႨ෮ླ֥࠹
ෘࠏ௜෻bູՎđૅ‫ݓ‬೘ն‫ނ‬໳ఖൌဒ൩čLawrence LivermoreaLos AlamosaSandia
‫ࡅݓ‬ൌဒ൩Ď‫ٳ‬љཟ೘ն࠹ෘࠏ‫܄‬ඳčIntelaIBMaSGI/Cray ‫܄‬ඳĎყ‫ר‬ਔ‫ڂ‬ᆴ‫ׄڜ‬
ᄎෘ෎؇ӑ‫ ݖ‬1TFLOPS ֥ѩྛ࠹ෘࠏbଢభၘࣜᄝᆃུൌဒ൩๧ೆ൐Ⴈ֥ѩྛ࠹
ෘࠏ༢๤đః‫ڂ‬ᆴ‫ׄڜ‬ᄎෘ෎؇ၘࣜӑ‫ݖ‬ਔ 50TFLOPSb
ѩྛ࠹ෘ֥ଽಸ‫ۂݤ‬٤ӈܼđၹՎ‫ޓ‬଴ି‫ؓܔ‬ఃࣉྛಆ૫૭ඍđᄝᆃ৚ࡼᇗׄࢺക
ѩྛ࠹ෘࠏุ֥༢ࢲ‫ܒ‬đщӱე࿽đѩྛෘ‫م‬đѩྛൌགྷ࠯ඌđѩྛႋႨೈࡱ֩b

§1.2 ѩྛ࠹ෘࠏ‫ؿ‬ᅚ৥ӱ
§1.2.1 ࠹ෘࠏ༢๤‫ؿ‬ᅚࡥൎ

࠹ෘࠏ֥ఏჷॖၛሔි֞୸ᇝ໓ၜ‫ྖگ‬ൈ௹ [4]b16-17 ൗࡀ֥නམࢳ٢‫ބ‬ഠ߶նэ


۪đնն՜ࣉਔሱಖ॓࿐࠯ඌ֥‫ؿ‬ᅚđఃᇏᇅᄯ၂෻ିϺᇹದࣉྛ࠹ෘ֥ࠏఖđࣼ൞ቋဲ
င֥නམࠅ޽ᆭ၂b
1614 ୍đ්۬ধದ John Napier ‫ؿ‬іਔܱႿॖၛ࠹ෘඹᄵᄎෘ‫ބ‬ٚ۴ᄎෘ֥ࣚెል
ᇂ֥ં໓b1642 ୍đ‫ݓم‬ඔ࿐ࡅ Pascal ‫ྛࣉିૼؿ‬ϖ໊࠹ෘ֥࠹ෘԄb1848 ୍đႇ‫ݓ‬ඔ
࿐ࡅ George Boole Է৫‫ࣉؽ‬ᇅսඔ࿐b1880 ୍ૅ‫௴ݓ‬Ұದ‫۽‬Ⴈਔ 7 ୍֥ൈࡗࣉྛ๤࠹đ
‫ ط‬1890 ୍đHerman Hollerith ႨԬ।वோթԥඔऌđѩഡ࠹ਔࠏఖđࣇࣇႨਔ 6 ۱ᇛࣼ
֤ԛਔሙಒ֥ඔऌč62622250 ದĎb1896 ୍đHerman Hollerith ԷϷਔ IBM ‫܄‬ඳ֥భദb
ᆃུ” ࠹ෘࠏ”đ‫׻‬൞ࠎႿࠏྀᄎྛٚൔđߎીႵ࠹ෘࠏ֥ਲ߿ğઆࠠᄎෘb‫ط‬ᄝᆃ
ᆭުđෛሢ‫׈‬ሰ࠯ඌ֥٦෎‫ؿ‬ᅚđ࠹ෘࠏष൓ਔᇉ֥ሇэb
1943 ୍֞ 1959 ୍ൈ௹֥࠹ෘࠏ๙ӈФӫቔֻ၂ս࠹ෘࠏb൐Ⴈᆇॢ‫׈‬ሰܵđ෮Ⴕ֥
§1.2 ѩྛ࠹ෘࠏ‫ؿ‬ᅚ৥ӱ 7

ӱ྽‫׻‬൞Ⴈࠏఖ઒щཿđ൐ႨԬ।वோb1946 ୍đJohn W. Mauchly ‫ ބ‬J. Presper Eckert


‫ڵ‬ᄳ࿹ᇅ֥ ENIAC (Electronic Numerical Integrator and Computer) ൞ֻ၂෻ᆇᆞၩၬ
ഈ֥ඔሳ‫׈‬ሰ࠹ෘࠏbᇗ 30 ؕđ18000 ۱‫׈‬ሰܵđ‫ ੱۿ‬25 తຐbᇶေႨႿ֐֡࠹ෘ‫ބ‬౟
֐࿹ᇅb
1949 ୍đ॓࿐ᄖᆽն։ყҩ” ໃট֥࠹ෘࠏ҂߶ӑ‫ ݖ‬1.5 ؕb” ᆇॢܵൈս֥࠹ෘࠏ
࣐ܵၘࣜ҄ೆਔགྷս࠹ෘࠏ֥ٓԐđ֌ఃุࠒᆭնaି‫ݻ‬ᆭۚa‫ܣ‬ᅰᆭ‫؟‬aࡎ۬ᆭ‫݌‬նն
ᇅჿਔ෱֥௴ࠣႋႨbᆰ֞ 1947 ୍đBell ൌဒ൩֥ William B. ShockleyaJohn Bardeen
‫ ބ‬Walter H. Brattain. ‫ૼؿ‬ਔุࣖܵđ‫׈‬ሰ࠹ෘࠏҌᅳ֞ਔอ٦֥ఏׄđषтਔ‫׈‬ሰൈ
սྍࡀჭb
1959 ୍֞ 1964 ୍ࡗഡ࠹֥࠹ෘࠏ၂ϮФӫֻູ‫ؽ‬ս࠹ෘࠏbնਈҐႨਔุࣖܵ‫ބ‬
ႆ඗‫׈‬ਫ਼b࠹ෘࠏุࠒ҂؎෪ཬđ‫ିۿ‬҂؎ᄹ఼đॖၛᄎྛ FORTRAN ‫ ބ‬COBOLđࢤ
൬ႇ໓ሳ‫ଁژ‬਷bԛགྷնਈႋႨೈࡱbุ࣐֥ܵࣖܵҐႨնն෪ཬਔ࠹ෘࠏุ֥ࠒaࢆ
֮ਔఃࡎ۬đࡨഒਔ‫ܣ‬ᅰb֌৖ದૌ֥ေ౰ಯҵ‫ޓ‬ჹđ‫౏ط‬۲ྛြؓ࠹ෘࠏ္Ӂളਔࢠ
ն֥ླ౰đളӁ۷఼a۷౞ьa۷ьၒ֥ࠏఖӮਔ֒ༀᆭࠤđ‫ࠢط‬Ӯ‫׈‬ਫ਼֥‫ૼؿ‬đ҂ࣇࣇ
൐ุࠒ֤ၛࡨཬđ۷൐෎؇ࡆॹđ‫ܣ‬ᅰࡨഒb
1958 ୍đᄝ Robert NoycečINTEL ‫܄‬ඳ֥Է൓ದĎ֥ਵ֝༯đ࠿‫ૼؿ‬ਔࠢӮ‫׈‬ਫ਼ުđ
Ⴛ๷ԛਔັԩ৘ఖb
1964 ୍֞ 1972 ୍֥࠹ෘࠏ၂ϮФӫֻູ೘ս࠹ෘࠏbնਈ൐ႨࠢӮ‫׈‬ਫ਼đ‫֥྘ׅ‬
ࠏ྘൞ IBM360 ༢ਙb1972 ୍ၛު֥࠹ෘࠏ༝ܸഈФӫֻູඹս࠹ෘࠏbࠎႿնܿଆࠢ
Ӯ‫׈‬ਫ਼đࠣުট֥ӑնܿଆࠢӮ‫׈‬ਫ਼b࠹ෘࠏ‫ିۿ‬۷఼đุࠒ۷ཬbᄝᆃᆭభđ࠹ෘࠏ࠯
ඌᇶေࠢᇏᄝն྘ࠏ‫ࠏ྘ཬބ‬ਵთ‫ؿ‬ᅚđ֌ෛሢӑնܿଆࠢӮ‫׈‬ਫ਼‫ັބ‬ԩ৘ఖ࠯ඌ֥ࣉ
҄đ࠹ෘࠏࣉೆ࿙ӈϤྠࡅ֥࠯ඌᅰθၘ๬௥bหљ൞Ֆ INTEL ‫҃ؿ‬ః૫ཟ۱ದࠏ֥ັ
ԩ৘ఖ 8080 ֥๝ൈđ޺৳ຩ࠯ඌa‫࠯ุૂ؟‬ඌ္֤֞ਔॢభ֥‫ؿ‬ᅚđ࠹ෘࠏᆇᆞष൓‫ڿ‬
эದૌ֥ളࠃb
1976 ୍đCray-1đֻ၂෻അႨӑࠩ࠹ෘࠏ໙ൗbࠢӮਔ 20 ຣ۱ุࣖܵđૄ૰ࣉྛ 1.5
ၡՑ‫ׄڜ‬ᄎෘbࣂ฿đINTEL ၘࣜ๷ԛᇶ௔ӑ‫ ݖ‬3.0Ghz ֥ັԩ৘ఖb
აᆜ۱ದো֥‫ؿ‬ᅚ৥ӱཌྷбaაԮ๤॓࿐࠯ඌཌྷбđ࠹ෘࠏ֥৥ൎҌ‫ېې‬ष൓඀ཿđ
໡ૌᆞᇂദఃᇏđ‫ۋ‬൳ఃರྍᄅၳ֥э߄đФ࠹ෘࠏնӖ‫ཹݕ‬ሢප‫ݸ‬҂֤๔ཱུb

§1.2.2 ѩྛ࠹ෘࠏ‫ؿ‬ᅚࡥඍ

40 ୍սष൓֥གྷս࠹ෘࠏ‫ؿ‬ᅚ৥ӱॖၛ‫ູٳ‬ਆ۱ૼཁ֥‫ؿ‬ᅚൈսğԱྛ࠹ෘൈսa
ѩྛ࠹ෘൈսbૄ၂۱࠹ෘൈս‫׻‬Ֆุ༢ࢲ‫ؿܒ‬ᅚष൓đࢤሢ൞༢๤ೈࡱčหљ൞щၲ
ఖაҠቔ༢๤ĎaႋႨೈࡱđቋުෛሢ໙ี౰ࢳߌ࣢֥‫ؿ‬ᅚ‫ط‬ղ֞‫ڂפ‬bԷࡹ‫ބ‬൐Ⴈѩྛ
࠹ෘࠏ֥ᇶေჰၹ൞ၹູѩྛ࠹ෘࠏ൞ࢳथֆԩ৘ఖ෎؇௞֥࣠ቋ‫ݺ‬ٚ‫م‬ᆭ၂b
8 ֻ၂ᅣ ყСᆩ്

ѩྛ࠹ෘࠏ൞Ⴎ၂ቆԩ৘ֆჭቆӮ֥đᆃቆԩ৘ֆჭ๙‫ݖ‬ཌྷ޺ᆭࡗ֥๙ྐაླྀቔđၛ
۷ॹ֥෎؇‫܋‬๝ປӮ၂ཛնܿଆ֥࠹ෘ಩ༀbၹՎđѩྛ࠹ෘࠏ֥ਆ۱ቋᇶေ֥ቆӮ҆
‫ٳ‬൞࠹ෘࢫׄ‫֥ࡗׄࢫބ‬๙ྐაླྀቔࠏᇅbѩྛ࠹ෘࠏุ༢ࢲ‫ؿ֥ܒ‬ᅚ္ᇶေุགྷᄝ࠹
ෘࢫׄྟି֥ิۚၛࠣࢫׄࡗ๙ྐ࠯ඌ֥‫ࣉڿ‬ਆٚ૫b
60 ୍սԚ௹đႮႿุࣖܵၛࠣՈྉթԥఖ֥ԛགྷđԩ৘ֆჭэ֤ᄀটᄀཬđթԥఖ
္۷ࡆཬె‫ބ‬৷ࡎbᆃུ࠯ඌ‫ؿ‬ᅚ֥ࢲ‫֝ݔ‬ᇁਔѩྛ࠹ෘࠏ֥ԛགྷđᆃ၂ൈ௹֥ѩྛ࠹
ෘࠏ‫؟‬൞ܿଆ҂ն֥‫܋‬ཚթԥ‫؟‬ԩ৘ఖ༢๤đࠧ෮໌ն྘ᇶࠏčMainframeĎbIBM360 ൞
ᆃ၂ൈ௹֥‫྘ׅ‬սіb
֞ਔ 60 ୍սଌ௹đ๝၂۱ԩ৘ఖष൓ഡᇂ‫؟‬۱‫ିۿ‬ཌྷ๝֥‫ିۿ‬ֆჭđੀඣཌ࠯ඌ္
ԛགྷਔbაֆՂิۚൈᇒ௔ੱཌྷбđᆃུѩྛหྟᄝԩ৘ఖଽ֥҆ႋႨննิۚਔѩྛ
࠹ෘࠏ༢๤֥ྟିb၈০୶၇ն࿐‫ ބ‬Burroughs ‫܄‬ඳՎൈष൓ൌീ IlliacIV ࠹߃đ࿹ᇅ
၂෻ 64 ۱ CPU ֥ SIMD ᇶࠏ༢๤đ෱ടࠣ֞႗ࡱ࠯ඌaุ༢ࢲ‫ܒ‬aI/O ഡСaҠቔ༢
๤aӱ྽ഡ࠹ე࿽ᆰᇀႋႨӱ྽ᄝଽ֥ᇙ‫؟‬࿹࣮ज़ีb҂‫ݖ‬đ֒၂෻ܿଆնն෪ཬਔ֥
16CPU ༢๤ᇔႿᄝ 1975 ୍૫ൗൈđᆜ۱࠹ෘࠏࢸၘࣜ‫ؿ‬ളਔऍնэ߄b
൮༵൞թԥ༢๤‫ྍ۪֥୑ۀ‬đิԛྴ୅թԥ‫ߏބ‬թ֥නམbIBM360/85 ༢๤ა 360/91
൞උႿ๝၂༢ਙ֥ਆ۱ࠏ྘đ360/91 ֥ᇶ௔ۚႿ 360/85đ෮࿊Ⴈ֥ଽթ෎؇္ࢠॹđѩ
౏ҐႨਔ‫׮‬෿‫ט‬؇֥ᆷ਷ੀඣཌĠ֌൞đ360/85 ֥ᆜุྟିಏۚႿ 360/91đື၂֥ჰၹ
ࣼ൞భᆀҐႨਔߏթ࠯ඌđ‫ުط‬ᆀᄵીႵb
ఃՑ൞϶ุ֝թԥఖष൓սูՈྉթԥఖbቋԚđ϶ุ֝թԥఖᆺ൞ᄝଖུࠏఖФ
Ⴈቔߏթđ‫ ط‬CDC7600 ᄵੱ༵ಆ૫ҐႨᆃᇕุࠒ۷ཬa෎؇۷ॹaॖၛᆰࢤ࿙ᆶ֥϶֝
ุթԥఖđՈྉթԥఖՖՎ๼ԛਔ৥ൎ໷෻bაՎ๝ൈđࠢӮ‫׈‬ਫ਼္ԛགྷਔđѩ࿡෎ႋႨ
֞ਔ࠹ෘࠏᇏbჭఖࡱ࠯ඌ֥ᆃਆն۪ଁྟ๬௥đ൐֤ IlliacIV ֥ഡ࠹ᆀૌᄝָҪ႗ࡱ
ၛࠣѩྛุ༢ࢲ‫ܒ‬ٚ૫ิԛ֥ᇕᇕ‫׻ࣉڿ‬նູ࿠೤b
1976 ୍ CRAY-1 ໙ൗၛުđཟਈ࠹ෘࠏՖՎহহֹ॥ᇅሢᆜ۱ۚྟି࠹ෘࠏ൧ӆ
15 ୍bCRAY-1 ؓ෮൐Ⴈ֥આࠠ‫׈‬ਫ਼ࣉྛਔࣚྏ֥ഡ࠹đҐႨਔ໡ૌೂࣂӫູ RISC ֥
ࣚࡥᆷ਷ࠢđߎႄೆਔཟਈ࠷թఖđၛປӮཟਈᄎෘbᆃ၂༢ਙಆྍ࠯ඌ൭‫֥؍‬൐Ⴈđ൐
CRAY-1 ֥ᇶ௔ղ֞ਔ 80MHzb
ັԩ৘ఖෛሢࠏఖ֥ሳӉՖ 4 ໊a8 ໊a16 ໊၂ᆰᄹࡆ֞ 32 ໊đఃྟି္ෛᆭཁᇷ
ิۚbᆞ൞ၹູु֞ਔັԩ৘ఖ֥ᆃᇕమ৯đवଽࠎ - ઼ੈն࿐ष൓ᄝ֒ൈੀྛ֥ DEC
PDP11 ཬ྘࠹ෘࠏ֥ࠎԤഈ࿹ᇅӮ‫ۿ‬၂෻Ⴎ 16 ۱ PDP11/40 ԩ৘ࠏ๙‫ࢌݖ‬ҭषܱა
16 ۱‫܋‬ཚթԥఖଆॶཌྷ৵ࢤ‫ط‬Ӯ֥‫܋‬ཚթԥ‫؟‬ԩ৘ఖ༢๤ C.mmpb
Ֆ 80 ୍սष൓đັԩ৘ఖ࠯ඌ၂ᆰᄝۚ෎భࣉb഍ުႻԛགྷਔ٤ӈൡ‫ކ‬Ⴟ SMP ٚ
ൔ֥ሹཌླྀၰđ‫ط‬ѵक़০ࡆᇜն࿐ᄵؓሹཌླྀၰࣉྛਔঔᅚđิԛਔ Cache ၂ᇁྟ໙ี
֥ԩ৘ٚσbՖՎđC.mmp षԷԛ֥‫܋‬ཚթԥ‫؟‬ԩ৘ఖᆭਫ਼ᄀሼᄀॺĠགྷᄝđᆃᇕุ༢
§1.3 ଢభൗࢸۚྟି࠹ෘࠏ֥ሑঃ 9

ࢲ‫ࠎࣜၘܒ‬Чഈ๤ᇍਔ‫ڛ‬ༀఖ‫ބ‬ም૫‫۽‬ቔᅟ൧ӆb
๝၂ൈ௹đࠎႿཨ༏Ԯ‫ࠏ־‬ᇅ֥ѩྛ࠹ෘࠏ္ष൓҂؎Ⴄགྷb80 ୍սᇏ௹đࡆᇜ৘
‫۽‬Ӯ‫ ࡼֹۿ‬64 ۱ i8086/i8087 ԩ৘ఖ๙‫ݖ‬ӑ৫ุٚ޺৵ࢲ‫ܒ‬৵ࢲఏটbՎުđь༵ުԛ
གྷਔ Intel iPSC ༢ਙaINMOS Transputer ༢ਙđIntel Paragon ၛࠣ IBM SP ֥భദ
Vulcan ֩ࠎႿཨ༏Ԯ‫ࠏ־‬ᇅ֥ѩྛ࠹ෘࠏb
80 ୍սଌ֞ 90 ୍սԚđ‫܋‬ཚթԥఖٚൔ֥նܿଆѩྛ࠹ෘࠏႻࠆ֤ਔྍ֥‫ؿ‬ᅚbIBM
ࡼնਈᄪ௹ RISC ັԩ৘ఖ๙‫޺ྙלݖ‬৵ຩ઎৵ࢲఏটbದૌष൓ॉ੮ೂ‫ޅ‬Ҍିᄝൌགྷ
‫܋‬ཚթԥఖߏթ၂ᇁ֥๝ൈđ൐༢๤ऎႵ၂‫֥ק‬ॖঔᅚྟčScalabilityĎb90 ୍սԚ௹đථ
ฌ‫ڞ‬ն࿐ิԛਔ DASH ࠹߃đ෱๙‫޹ົݖ‬၂۱ЌթႵૄ၂ߏթॶ໊ᇂྐ༏֥ଢ੣ࢲ‫ܒ‬ট
ൌགྷ‫҃ٳ‬ൔ‫܋‬ཚթԥఖ֥ߏթ၂ᇁྟbުটđIEEE ᄝՎࠎԤഈิԛਔߏթ၂ᇁྟླྀၰ֥
ѓሙb
90 ୍սၛটđᇶေ֥ࠫᇕุ༢ࢲ‫ܒ‬ष൓ሼཟವ‫ކ‬bඋႿඔऌѩྛো྘֥ CM-5 Ԣն
ਈҐႨഅ௖߄֥ັԩ৘ఖၛຓđ္ᄍྸႨ޼Ҫ֥ӱ྽Ԯ‫־‬၂ུࡥֆ֥ཨ༏ĠCRAY T3D
൞၂෻ NUMA ࢲ‫܋֥ܒ‬ཚթԥ྘ѩྛ࠹ෘࠏđ֌൞෱္ิ‫܂‬ਔಆअ๝҄ࠏᇅaཨ༏ؒਙ
ࠏᇅđѩҐ౼ਔ၂ུࡨഒཨ༏Ԯ‫־‬࿼Ӿ֥࠯ඌb
ෛሢഅ௖߄ັԩ৘ఖaຩ઎ഡС֥‫ؿ‬ᅚđၛࠣ MPI/PVM ֩ѩྛщӱѓሙ֥‫҃ؿ‬đ
ࠏಕࡏ‫֥ܒ‬ѩྛ࠹ෘࠏԛགྷbIBM SP2 ༢ਙࠏಕ༢๤ࣼ൞ఃᇏ֥‫྘ׅ‬սіbᄝᆃུ༢๤
ᇏđ۲۱ࢫׄҐႨ֥‫׻‬൞ѓሙ֥അ௖߄࠹ෘࠏđ෱ૌᆭࡗ๙‫ۚݖ‬෎ຩ઎৵ࢤఏটb
ࣂ฿đᄀটᄀ‫֥؟‬ѩྛ࠹ෘࠏ༢๤ҐႨഅ௖߄֥ັԩ৘ఖࡆഈഅ௖߄֥޺৵ຩ઎‫ܒ‬
ᄯđᆃᇕ‫҃ٳ‬թԥ֥ѩྛ࠹ෘࠏ༢๤ӫູࠏಕb‫ݓ‬ଽࠫެ෮Ⴕ֥ۚྟି࠹ෘࠏӌഅ‫׻‬ള
ӁᆃᇕऎႵࠞۚྟିࡎ۬б֥ۚྟି࠹ෘࠏđѩྛ࠹ෘࠏࣼࣉೆਔ၂۱ྍ֥ൈսđѩྛ
࠹ෘ֥ႋႨղ֞ਔభ෮ໃႵ֥ܼ؇‫ބ‬ധ؇b

§1.3 ଢభൗࢸۚྟି࠹ෘࠏ֥ሑঃ
ѩྛ࠹ෘࠏෛሢັԩ৘ྉோ֥‫ؿ‬ᅚđၘࣜࣉೆਔ၂۱ྍൈսbଢభѩྛ࠹ෘࠏ֥ྟ
ିၘࣜࢤ࣍ 100TFLOPSđ1000TFLOPS ֥ѩྛ࠹ෘࠏᆞᄝܿ߃ᆭᇏb໡‫ݓ‬ѩྛ࠹ෘࠏ
֥࿹ᇅၘࣜሼᄝൗࢸభਙđᆞᄝ࿹ᇅളӁ 100TFLOPS ֥ऍ྘࠹ෘࠏ༢๤b2003 ୍Ⴎ৳
མ‫܄‬ඳളӁ֥ധอ 6800 ᄝ 2003 ୍ 11 ᄅൗࢸTOP500 ஆ଀ᇏ໊ਙֻ 14 ଀đ2004 ୍ආ
ܻ‫܄‬ඳളӁ֥ආܻ 4000A ᄝ 2004 ୍ 6 ᄅ֥ൗࢸTOP500 ஆ଀ᇏ໊ਙֻ 10 ଀đᆃ൞໡
‫܄ݓ‬ष‫࠹ିྟ֥ۚ҃ؿ‬ෘࠏᄝൗࢸTOP500 ᇏ൮Ցࣉೆభ൅଀đᆃѓᆽሢ໡‫ݓ‬ᄝѩྛ࠹
ෘࠏ༢๤֥࿹ᇅ‫ބ‬ളӁᇏၘࣜ‫ۊ‬ഈਔ‫ࣉ༵࠽ݓ‬ඣ௜đູิۚ໡‫֥॓ݓ‬࿐࿹࣮ඣ௜‫ק׍‬ਔ
໾ᇉࠎԤbі 1.1 ൞οᅶ 2004 ୍ 11 ᄅ‫֥҃܄‬ൗࢸ TOP500 ஆ଀ϼ֤ԛ֥ [3]b
ՖTOP500 ֥భ 10 ଀і 1.1 টुđૅ‫ݓ‬ಯಖ൞ӑࠩ࠹ෘࠏ֥ቋնႚႵᆀbοᅶൗ
10 ֻ၂ᅣ ყСᆩ്

і 1.1: ൗࢸ TOP10 ѩྛ࠹ෘࠏ

Rank site computer Rmax


country/year processor/manufacturer Rpeak
1 IBM/DOE BlueGene/L DD2 beta-System, 0.7GHz PowerPC 70720
United States/2004 32768 / IBM 91750
2 NASA/Ames SGI Altix 1.5GHz, Voltaire Infiniband 51870
United States/2004 10160 / SGI 60960
3 Earth Sim. Center Earth-Simulator 35860
Japan/2002 5120 / NEC 40960
4 Barcelona SC eServer BladeCenter 2.2GHz PowerPC, Myrinet 20530
Spain/2004 3564 / IBM 1363
5 LLNL Thunder Itanium2 Tiger4 1.4GHz, Quadrics 19940
United States/2004 4096 / California Digital Corp. 22938
6 LANL ASCI Q - AlphaServer SC45, 1.25GHz 13880
United States/2004 8192 / HP 20480
7 Virginia Tech System X Dual 2.3GHz Apple XServe, Infiniband 12250
United States/2004 2200 / Self-made 20240
8 IBM - Rochester BlueGene/L DD1 Prototype 0.5GHz PowerPC 11680
United States/2004 8192 / IBM/ LLNL 16384
9 NAVOCEANO eServer pSeries 655 1.7GHz Power4+ 10310
United States 2944 / IBM 20019
10 NCSA Tungsten PowerEdge1750 Xeon 3.06GHz, Myrinet 9819
United States/2003 2500 / Dell 15300
§1.4 ॖঔᅚ֥ѩྛ࠹ෘࠏุ༢ࢲ‫ܒ‬ 11

ࢸTOP500 ֥๤࠹ඔऌট‫ٳ‬༅đૅ‫ݓ‬ᄝ࠹ෘି৯ഈᅝႵ࣍ಆൗࢸ֥၂϶đᄝTOP500 ᇏ
֥෮Ⴕ࠹ෘࠏᇏႚႵ֥ඔਈӑ‫ ݖ‬50%b

і 1.2: ൗࢸTOP500 ѩྛ࠹ෘࠏุ༢ࢲ‫ٳܒ‬༅


count share Rmax sum Rpeak sum procrssor sum
Cluster 294 58.8 612373 1101130 209421
Constellations 106 21.2 122640 192482 44016
MPP 100 20 392468 578794 155192

Ֆі 1.2 ॖၛुԛđଢభൗࢸۚྟି࠹ෘࠏ֥ᇶੀࢲ‫ܒ‬൞ࠏಕb

§1.4 ॖঔᅚ֥ѩྛ࠹ෘࠏุ༢ࢲ‫ܒ‬
۴ऌᆷ਷ੀ‫ބ‬ඔऌੀ֥҂๝đ๙ӈϜ࠹ෘࠏ༢๤‫ູٳ‬ඹো [1, 2]:
• ֆᆷ਷ੀֆඔऌੀčSISDĎ
• ֆᆷ਷ੀ‫؟‬ඔऌੀčSIMDĎ
• ‫؟‬ᆷ਷ੀֆඔऌੀčMISDĎ
• ‫؟‬ᆷ਷ੀ‫؟‬ඔऌੀčMIMDĎ
ѩྛ࠹ෘࠏ༢๤Ԣഒਈᄪ௹֥aህႨ֥SIMD ༢๤ຓđधն҆‫ູٳ‬MIMD ༢๤bଢభᇶ
ေ֥ѩྛ࠹ෘࠏ༢๤Ⴕ໴ᇕğ
• ѩྛཟਈࠏčPVPđParallel Vector ProcessorĎĠ
• ؓӫ‫؟‬ԩ৘ࠏčSMP,Symmetric MultiprocessorĎĠ
• նܿଆѩྛԩ৘ࠏčMPPđMassively Parallel ProcessorĎĠ
• ࠏಕčClusterĎĠ
• ‫҃ٳ‬ൔ‫܋‬ཚթԥ‫؟‬ԩ৘ࠏčDSMđDistributied Shared MemoryĎb
ᆃ໴ো࠹ෘࠏ༢๤սіਔ֒ࣂൗࢸѩྛ࠹ෘࠏ֥ᇶေุ༢ࢲ‫ܒ‬đ༯૫໡ૌࡥֆࢺക၂༯
SMPaDSMaMPP ‫ࠏބ‬ಕѩྛ࠹ෘࠏ༢๤b

§1.4.1 ؓӫ‫؟‬ԩ৘ࠏ༢๤

๭ 1.1 ൞ؓӫ‫؟‬ԩ৘ࠏ༢๤֥ࡥֆࢲ‫ܒ‬đ෱Ⴎԩ৘ֆჭaۚ෎ߏթaሹཌࠇࢌҭष
ܱa‫܋‬ཚଽթၛࠣ I/O ֩ቆӮb
SMP ऎႵೂ༯หᆘğ
• ؓӫ‫܋‬ཚթԥğ༢๤ᇏ֥಩‫ޅ‬ԩ৘ࠏनॖᆰࢤ٠໙಩‫ޅ‬ଽթଆॶ֥թԥֆჭ‫ ބ‬I/O
ଆॶ৵ࢤ֥ I/O ഡСđ౏٠໙֥࿼Ӿaջॺ‫ބ‬٠໙Ӯ‫ੱۿ‬൞၂ᇁ֥b෮Ⴕଽթଆॶ
12 ֻ၂ᅣ ყСᆩ്

CPU CPU CPU

Cache Cache Cache

Bus or Crossbar Switch

Memory Memory I/O

๭ 1.1: ؓӫ‫؟‬ԩ৘ࠏ༢๤

ֹ֥ᆶֆჭ൞๤၂щ઒֥đ۲۱ԩ৘ࠏᆭࡗֹ໊֥ཌྷ๝bҠቔ༢๤ॖၛᄎྛᄝ಩ၩ၂
۱ԩ৘ࠏഈb
• ֆ၂֥Ҡቔ༢๤႘ཞğಆ༢๤ᆺႵ၂۱Ҡቔ༢๤ሁ਽ᄝ‫܋‬ཚթԥఖᇏđ෱۴ऌ۲۱ԩ
৘ࠏ֥‫ڵ‬ᄛ౦ঃđ‫׮‬෿‫ٳ‬஥۲۱ԩ৘ࠏ֥‫ڵ‬ᄛđѩЌӻૄ۱ԩ৘ࠏ֥‫ڵ‬ᄛन‫ޙ‬b
• अ҆ۚ෎ߏթࠣఃඔऌ၂ᇁྟğૄ۱ԩ৘ࠏनႵሱ֥࠭ۚ෎ߏթđ෱ૌॖၛႚႵ‫׿‬৫
֥अ҆ඔऌđ֌൞ᆃུඔऌсྶЌӻაթԥఖᇏ֥ඔऌ൞၂ᇁ֥b
• ֮๙ྐ࿼Ӿğ۲۱ࣉӱ۴ऌҠቔ༢๤ิ‫؀֥܂‬/ཿҠቔđ๙‫܋ݖ‬ཚඔऌߏթ౵টປӮ
ԩ৘ࠏᆭࡗ֥๙ྐđః࿼Ӿ๙ӈჹཬႿຩ઎๙ྐ֥࿼Ӿb
• ‫܋‬ཚሹཌ֥ջॺğ෮Ⴕԩ৘ࠏ‫܋‬ཚ๝၂۱ሹཌջॺđປӮؓଽթଆॶ֥ඔऌ‫ ބ‬I/O
ഡС֥٠໙b
• ᆦӻཨ༏Ԯ‫־‬a‫܋‬ཚթԥଆൔ֥ѩྛӱ྽ഡ࠹b
SMP ऎႵೂ༯ಌׄğ
• ఴॖौğሹཌaթԥఖࠇҠቔ༢๤ാིॖ֝ᇁ༢๤ಆ҆คߓb
• ॖঔᅚྟҵğႮႿ෮Ⴕԩ৘ࠏ‫܋‬ཚ๝၂۱ሹཌջॺđ‫ط‬ሹཌջॺૄ 3 ୍Ҍᄹࡆ 2 Пđ
۵҂ഈԩ৘ࠏ෎؇‫ބ‬ଽթಸਈ֥‫ؿ‬ᅚ҄‫ق‬bၹՎđSMP ѩྛ࠹ෘࠏ༢๤֥ԩ৘ࠏ۱
ඔ၂ϮഒႿ 64 ۱đ္ࣼᆺିิ‫ૄ܂‬૰ඔϤၡՑ֥‫ׄڜ‬ᄎෘྟିb
SMP ֥‫྘ׅ‬սіğ
• SGI Power Challenge XL ༢ਙѩྛ࠹ෘࠏč32 ۱ MIPS R10000 ັԩ৘ఖĎ
• COMPAQ Alphaserver 84005/440č12 ۱ Alpha 21264 ັԩ৘ఖĎ
• HP HP9000/T600č12 ۱ HP PA9000 ັԩ৘ఖĎ
• IBM RS6000/R40č8 ۱ RS6000 ັԩ৘ఖĎ
§1.4 ॖঔᅚ֥ѩྛ࠹ෘࠏุ༢ࢲ‫ܒ‬ 13

§1.4.2 ‫܋҃ٳ‬ཚթԥԩ৘ࠏ༢๤

CPU0 CPUn CPU0 CPUn

Cache Cache Cache Cache

HUB HUB

Router M0 Router Mp

Node0 Nodep

High Performance Interconnect Network

๭ 1.2: ‫܋҃ٳ‬ཚթԥԩ৘ࠏ༢๤

๭ 1.2 ൞‫܋҃ٳ‬ཚթԥԩ৘ࠏ༢๤đDSM ࢠ‫ڿֹݺ‬೿ਔ SMP ֥ॖঔᅚି৯đ൞ଢ


భۚྟି࠹ෘࠏ֥ᇶੀ‫ؿ‬ᅚٚཟᆭ၂b
DSM ֥หׄğ
• ѩྛ࠹ෘࠏၛࢫູׄֆ໊ğૄ۱ࢫׄႮ၂۱ࠇ‫؟‬۱ CPU ቆӮđૄ۱ CPU ႚႵሱ࠭
֥अ҆ۚ෎ߏթ (Cache)đѩ‫܋‬ཚअ҆թԥఖ‫ ބ‬I/O ഡСđ෮Ⴕࢫׄ๙‫ିྟۚݖ‬ຩ઎
޺৳b
• ໾৘ഈ‫҃ٳ‬թԥğଽթଆॶअ҆ᄝ۲ࢫׄᇏđѩ๙‫ିྟۚݖ‬ຩ઎ཌྷ޺৵ࢤđх૧ਔ
SMP ٠թሹཌ֥ջॺ௞࣠đᄹ఼ਔѩྛ࠹ෘࠏ༢๤֥ॖঔᅚି৯b
• ֆ၂֥ଽթֹᆶॢࡗğ࣐ܵଽթଆॶ‫҃ٳ‬ᄝ۲۱ࢫׄđ֌൞෮Ⴕᆃུଽթଆॶ‫׻‬Ⴎ႗
ࡱࣉྛਔ๤၂щᆶđѩ๙‫޺ݖ‬৳ຩ઎৳ࢤྙӮਔѩྛ࠹ෘࠏ֥‫܋‬ཚթԥఖb۲۱ࢫׄ
࠻ॖၛᆰࢤ٠໙अ҆ଽթֆჭđႻॖၛ٠໙ః෱ࢫ֥ׄअ҆թԥֆჭb
• ٤၂ᇁଽթ٠໙čNUMAĎଆൔğႮႿჹ؊٠໙сྶ๙‫޺ିྟۚݖ‬৳ຩ઎đ‫ط‬Чֹ٠
໙ᆺླᆰࢤ٠໙अ҆ଽթଆॶbၹՎჹ؊٠໙֥࿼Ӿ၂Ϯ൞Чֹ٠໙࿼Ӿ֥ 3 Пቐ
Ⴗb
• ֆ၂֥Ҡቔ༢๤႘ཞğোරႿSMPđᄝDSM ѩྛ࠹ෘࠏᇏđႨ޼ᆺु֞၂۱Ҡቔ༢
๤đ෱ॖၛ۴ऌ۲۱ࢫ֥ׄ‫ڵ‬ᄛ౦ঃđ‫׮‬෿ֹ‫ٳ‬஥ࣉӱb
• ࠎႿۚ෎ߏթ֥ඔऌ၂ᇁྟğ๙ӈҐႨࠎႿଢ੣֥ۡුߏթ၂ᇁྟླྀၰটЌᆣ۲ࢫ
14 ֻ၂ᅣ ყСᆩ്

֥ׄअ҆ۚ෎ߏթඔऌაթԥఖᇏ֥ඔऌ൞၂ᇁ֥b๝ൈđ໡ૌӫᆃᇕDSM ѩྛ࠹
ෘࠏࢲ‫ ູܒ‬CC-NUMA ࢲ‫ܒ‬b
• ֮๙ྐ࿼Ӿაۚ๙ྐջॺğህႨ֥ۚྟି޺৳ຩ઎൐֤ࢫׄࡗ֥٠໙࿼Ӿ‫ཬޓ‬đ๙ྐ
ջॺॖၛঔᅚb২ೂđଢభቋऎսіྟ֥DSM ѩྛ࠹ෘࠏ SGI Origin 3000đ෱֥ච
ཟׄؓׄջॺॖղ 3.2GB/૰đ‫ط‬࿼ӾཬႿ 1 ۱ັ૰b
• ॖঔᅚྟۚğDSM ѩྛ࠹ෘࠏॖঔᅚ֞ഈత۱ࢫׄđିิ‫ૄ܂‬૰ඔຣၡՑ֥‫ׄڜ‬ᄎ
ෘྟିb
• ᆦӻཨ༏Ԯ‫־‬a‫܋‬ཚթԥѩྛӱ྽ഡ࠹b
DSM ֥‫྘ׅ‬սіğ
• SGI Origin 2000a3000a3800Ġ
• SGI Altixb

§1.4.3 նܿଆѩྛ࠹ෘࠏ༢๤

M0 M1 Mp

Cache Cache Cache

CPU0 CPU1 CPUp

Specialized Interconnect Network

๭ 1.3: նܿଆѩྛ࠹ෘࠏ༢๤

๭ 1.3 ൞၂۱նܿଆѩྛ࠹ෘࠏ༢๤֥ࡥֆࢲ‫ܒ‬đ෱൞ѩྛ࠹ෘࠏ‫ؿ‬ᅚ‫ݖ‬ӱᇏ֥ᇶ
৯đགྷᄝၘࣜ‫ؿ‬ᅚ֞Ⴎഈຣ۱ԩ৘ࠏ‫ܒ‬Ӯ၂۱༢๤đෛሢѩྛ࠹ෘࠏ֥‫ؿ‬ᅚđࠫ൅ຣ۱ԩ
৘ࠏ֥ӑնܿଆ༢๤္߶ᄝ҂ࣲ֥ࡼট໙ൗb
MPP ֥หׄğ
• ࢫׄඔਈ‫؟‬đӮతഈຣđᆃུࢫׄႮअ҆ຩव๙‫޺ିྟۚݖ‬৳ຩ઎৵ࢤb
• ૄ۱ࢫׄ‫׻‬ཌྷؓ‫׿‬৫đѩႚႵ၂۱ࠇ‫؟‬۱ັԩ৘ࠏbᆃུັԩ৘ࠏ‫׻‬Ⴕअ҆ۚ෎ߏ
թđѩ๙‫ݖ‬अ҆ሹཌࠇ޺৳ຩ઎აअ҆ଽթଆॶ‫ ބ‬I/O ഡСཌྷ৵ࢤb
• MPP ֥۲۱ࢫׄनႚႵ҂๝֥Ҡቔ༢๤႘ཞđ၂Ϯ౦ঃ༯đႨ޼ॖၛࡼቔြิࢌ۳
ቔြܵ৘༢๤đႮ෱ট‫ט‬؇֒భ༢๤ᇏႵི֥࠹ෘࢫׄটᆳྛ‫ھ‬ቔြb๝ൈđMPP
༢๤္ᄍྸႨ޼֨੣֞ᆷ‫ׄࢫ֥ק‬đࠇ֞ଖུห‫ׄࢫ֥ק‬ഈᄎྛቔြb
• ۲۱ࢫׄഈ֥ଽթଆॶ൞ཌྷ޺‫׿‬৫֥đ౏҂թᄝಆअଽթֆჭ֥๤၂႗ࡱщᆶb၂Ϯ
౦ঃ༯đ۲۱ࢫׄᆺିᆰࢤ٠໙ሱദ֥अ҆ଽթଆॶbೂ‫ླݔ‬ေᆰࢤ٠໙ః෱ࢫ֥ׄ
ଽթଆॶđᄵсྶႵҠቔ༢๤ิ‫܂‬ห൹֥ೈࡱᆦӻb
§1.4 ॖঔᅚ֥ѩྛ࠹ෘࠏุ༢ࢲ‫ܒ‬ 15

MPP ֥‫྘ׅ‬սіğ
• ICT Dawning 1000č32 ۱ԩ৘ࠏĎĠ
• IBM ASCI Whiteč8192 ۱ԩ৘ࠏĎĠ
• Intel ASCI Redč9632 ۱ԩ৘ࠏĎĠ
• Cray T3Eč1084 ۱ԩ৘ࠏĎ

§1.4.4 ࠏಕ༢๤

• Linux ࠏಕ༢๤࠭Ӯູቋੀྛ֥ۚྟି࠹ෘ௜෻đᄝۚྟି࠹ෘࠏᇏᅝႵᄀটᄀն֥
бᇗ
• ༢๤ܿଆॖՖֆࠏaഒඔࠫ෻৳ຩ֥ັࠏᆰ֞Їওഈత۱ࢲ֥ׄնܿଆѩྛ༢๤
• ࠻ॖቔູ৷ࡎ֥ѩྛӱ྽‫ט‬൫ߌ࣢đ္ॖഡ࠹Ӯᆇᆞ֥ۚྟିѩྛࠏ
• ௴ࠣѩྛ࠹ෘс҂ॖഒ֥‫۽‬ऎ
• ႨႿۚྟି࠹ෘ֥ࠏಕ༢๤ᄝࢲ‫ܒ‬ഈa൐Ⴈ֥ೈࡱ‫۽‬ऎഈ๙ӈႵљႿႨႿิ‫܂‬ຩ઎a
ඔऌ९‫ڛ‬ༀ֥ࠏಕ (ުᆀၧӫູ‫ڛ‬ༀఖࠢಕ)
• TOP500 Supercomputer Sites
• Cluster@TOP500
• ҕॉሧਘ: Ⴈܱ࡯ሳ “cluster howto” ᄝຩഈෆ෬ཌྷܱҋਘ . . .

๭ 1.4: ‫ ྘ׅ‬Linux ࠏಕ༢๤

§1.4.4.1 ‫ ࡹܒ‬Linux ࠏಕ֥ေ෍

• ֆ෻ࠇ৳ຩ֥‫؟‬෻ັࠏࠇ‫ڛ‬ༀఖ
16 ֻ၂ᅣ ყСᆩ്

• Linux ༢๤: RedHat, Debian, SuSE, Mandrake, . . .


• (ॖ࿊) ۚ෎ଽ৳ຩ઎: తᅸၛ෾ຩđMyrinet, QsNet, Dolphin SCI , Infiniband , . . .
• щၲ༢๤: gcc/g++/g77, PGI , Intel , . . .
• MPI ༢๤: MPICH , LAM-MPI , . . .
• ຩ઎໓ࡱ༢๤: NFS, PVFS , Lustre . . .
• ሧჷܵ৘აቔြ‫ט‬؇: PBS , Condor , LSF , . . .
• ඔ࿐९:
BLAS MKL, ATLAS , Kazushige Goto’s BLAS (๷ࡩ)
FFTW http://www.fftw.org/
LAPACK http://www.netlib.org/lapack/
ScaLAPACK http://www.netlib.org/scalapack/
...
• ః෱‫۽‬ऎ:
PETSc http://www-unix.mcs.anl.gov/petsc/petsc-2/
UG http://cox.iwr.uni-heidelberg.de/~ug/
...

§1.4.4.2 ህႨѩྛࠏಕ

ᆷህ૊ࡹᄯ֥ႨႿѩྛ࠹ෘ֥ࠏಕb
• ๙ӈֆ‫ྙ׿‬Ӯ၂۱अთຩđᄜ๙‫ݖ‬၂۱ຩܱ৵ࢤ֞ Internet
• ๙ӈ൐Ⴈଽ҆ IP ֹᆶ (ೂ 192.168.0.x), ؓຓ҆‫ط‬࿽ᆺႵຩܱ൞ॖ࡮֥
• ॖ۴ऌླေഡ৫၂ᇀඔ෻‫ڛ‬ༀఖđ‫ٳ‬љӵքຩܱaൈᇒ๝҄ (NTP)aNIS/LDAPaຩ
઎໓ࡱ༢๤ (NFS)aሧჷܵ৘aႨ޼֨੣aቔြ‫ט‬؇֩‫ڛ‬ༀ
• ๙‫ ݖ‬IP ເል (IP Masquerading) ࠇຩ઎ֹᆶሇߐ (NAT , Network Address Transla-
tion) ൐֤ଽ҆ࢲׄି‫ܔ‬ᆰࢤ٠໙ Internet (ipchains ࠇ iptables)
• ০ႨLVS (Linux Virtual Server) ࡼຓ҆Ⴈ޼‫ٳ‬஥֞֨੣ࢲׄ
• ն྘ࠏಕ๙ӈҐႨνልᄝࠏ݊ᇏ֥ࠏࡏൔࠇ֗ோൔ‫ڛ‬ༀఖđѩႵህ૊஥С֥ UPS ࠣ
ॢ‫ט‬

§1.5 ‫ݓ‬ଽຓӑࠩ࠹ෘᇏྏሑঃ
§1.5.1 ૅ‫ݓ‬ӑࠩ࠹ෘᇏྏࡥࢺ

• San Diego ӑࠩ࠹ෘᇏྏ (SDSC)Ӯ৫Ⴟ 1985 ୍đ๙‫ݖ‬ն৯‫ؿ‬ᅚ࠹ෘ॓࿐‫࠹ିྟۚބ‬


ෘđ๷‫॓࠽ݓ׮‬࿐‫۽ބ‬ӱฐ෬bෛሢᆃ၂Ԯ๤ሷᆻᇯࡶ҄ೆ༵ࣉ࠹ෘഡീčcyberinfrastructureĎ
§1.5 ‫ݓ‬ଽຓӑࠩ࠹ෘᇏྏሑঃ 17

֥ൈսđSDSC ၘࣜӮູ॓࿐aఒြa࿐ඌ֥ᅞ੻ሧჷđք‫ڵ‬ሢඔऌܵ৘aຩ۬࠹ෘa
ള໾ྐ༏aֹ৘ྐ༏aۚ؊࠹ෘၛࠣః෱॓࿐‫۽‬ӱ࿐֥॓ਵֹ໊֝bSDSC ֥൐ଁ൞
࿼ഥ॓࿐Ӯࣼđཟഠ߶ิ‫ିྟۚ܂‬႗ࡱ࠯ඌaࠢӮೈࡱ࠯ඌၛࠣധ؇֥ॴ࿐॓ህြ࠯
ିb
• ૅ‫ࡅݓݓ‬ӑࠩ࠹ෘႋႨᇏྏ (NCSA)ԷࡹႿ 1986 ୍ 1 ᄅbNCSA ᄝۚྟି࠹ෘa
ຩ઎aթԥ‫ބ‬ඔऌ‫ٳ‬༅ਵთऎႵࢠۚ‫࠽ݓ‬ലუb෱Ф၂ܺಪູ൞Էྍྟ֥॓࿐‫۽‬
ӱ༢๤‫ބ‬ೈࡱ֥༵‫ڃ‬bNCSA ֥ሷᆻ൞აॖᇕ࿹࣮ਵთ‫ކ‬ቔđԷࡹ༵ࣉ࠹ෘഡീ
čcyberinfrastructureĎđฐ෬ྍ֥॓࿐‫ؿ‬གྷb෱֥ህြหӉ൞ႋႨቋ༵ࣉ֥࠹ෘࠏđ
‫ࡹܒ‬ವ‫ކ‬ೈࡱႋႨaॖ൪߄‫۽‬ऎaඔऌ຋ड‫ٳބ‬༅‫۽‬ऎ֥‫۽‬ቔ༢๤bᆃུԷྍ༢๤ࡼ
Ӯູໃট༵ࣉ࠹ෘഡീ֥‫ྏނ‬đϜ‫ٳ‬೛༢๤৵๙Ӯູֆ၂a໭‫֥ډ‬ሧჷbNCSA ൞
National Science Foundation ֥ TeraGrid ࠹߃֥ܱ࡯‫ކ‬ቔࠄϴđ‫߃࠹ھ‬๧ሧਔ၂ၡ
ૅჭđϺᇹ࿹࣮ದჴჹӱ٠໙ቋॹ෎֥a‫֥ࠩפ‬ӑࠩ࠹ෘࠏaॖ൪߄‫۽‬ऎaႋႨೈࡱa
Ԯ‫ۋ‬ఖa၎ఖၛࠣն྘թԥഡСb
• Pittsburgh ӑࠩ࠹ෘᇏྏ ൞ Carnegie Mellon ն࿐aPittsburgh ն࿐ၛࠣ Westing
house Electric ‫܄‬ඳ‫܋‬๝ቆࡹ֥b෱Ӯ৫Ⴟ 1986 ୍đ֤֞‫؟‬۱৳Ϲ҆૊ၛࠣ Pennsyl-
vania ᇛᆟ‫ބک‬඲ದఒြ‫܋‬๝ุ֥ᆦӻbః൐ଁ൞ཟ‫ࡅݓ‬ഠ߶ิ‫܂‬၂ੀ֥࠹ෘሧჷđ
ᆦӻ॓࿐‫۽‬ӱਵთᇶေ໙ี֥ࢳथĠ๷‫࠹׮‬ෘ॓࿐a࠹ෘ࠯ඌၛࠣ‫ྐࡅݓ‬༏ഡീ֥‫ؿ‬
ᅚĠཟ࿹࣮ದჴԮ൱ۚྟି࠯ඌၛࠣ෱ૌ֥൐ႨĠϺᇹ඲ದ҆૊đष‫࠹ିྟۚؿ‬ෘೈ
ࡱđ՜ࣉ෰ૌ֥ࣩᆚႪ൝b
• ...

§1.5.2 ᇏ‫ݓ‬ն੤ӑࠩ࠹ෘᇏྏࡥࢺ

• ‫࠹ିྟۚࡅݓ‬ෘᇏྏčКࣘĎ൞‫॓ࡅݓ‬຾ᄝආܻ 1000 նܿଆѩྛ࠹ෘࠏ࿹ᇅӮ‫ۿ‬ᆭ


ުđႿ 1995 ୍ 5 ᄅ஻ሙӮ৫ֻ֥၂۱ۚྟି࠹ෘᇏྏb
• ‫࠹ିྟۚࡅݓ‬ෘᇏྏč‫ކ‬٧Ď ൞‫॓ࡅݓ‬຾Ⴟ 1995 ୍ 9 ᄅ 5 ರ஻ሙӮ৫֥” ᇏ‫ކݓ‬
٧ۚྟି࠹ෘᇏྏ” ֥భദđ1998 ୍ 5 ᄅ 18 ರ‫ࡼ҆࠯॓ࡅݓ‬ఃၞ଀ູགྷ଀bᇏྏ৮
උႿνߪസ॓࠯๏aᇏ‫॓ݓ‬࿐࠯ඌն࿐aᇏ‫॓ݓ‬࿐ჽ‫ކ‬٧‫ٳ‬ჽ‫ބ‬ᇏ‫॓ݓ‬࿐࠯ඌն࿐ۚ
֩࿹࣮ჽb
• ‫࠹ିྟۚࡅݓ‬ෘᇏྏčӮ‫׻‬Ď ൞ĖĞĞĜ୍ĖĖᄅĖĖರᄝ༆ଲࢌ๙ն࿐ᆞൔ‫ܫ‬இ
Ӯ৫֥b
• ‫࠹ିྟۚࡅݓ‬ෘᇏྏč໳‫ݱ‬Ď Ӯ৫Ⴟ 1997 ୍ 12 ᄅ 20 ರđ൞ࣜ‫॓ࡅݓ‬຾஻ሙđႮ
‫҆࠯॓ࡅݓ‬a‫࢝ࡅݓ‬ტ҆a޵Кസ॓࠯๏a໳‫ݱ‬൧॓຾‫޿ބ‬ᇏ॓࠯ն࿐‫܋‬๝ԛሧᆦӻ
֥b
• ‫࠹ିྟۚࡅݓ‬ෘᇏྏčഈ‫ݚ‬Ď Ӯ৫Ⴟ 1998 ୍ 4 ᄅđ໊Ⴟഈ‫֊گݚ‬ն࿐đႮ‫࠯॓ࡅݓ‬
18 ֻ၂ᅣ ყСᆩ്

҆đഈ‫ݚ‬൧॓຾‫֊گބ‬ն࿐‫ކ‬ሧቆࡹb
• ‫࠹ିྟۚࡅݓ‬ෘᇏྏč‫ݳ‬ᇜĎႿ 2001 ୍ 4 ᄅ 1 ರđ၇ກᆄࡾസࠎၹቆྐ༏࿐ᇗׄൌ
ဒ൩aᆄࡾն࿐ࠎၹቆྐ༏࿐࿹࣮෮ᄝ‫ݳ‬ᇜӮ৫b
• ‫࠹ିྟۚࡅݓ‬ෘᇏྏč༆νĎ Ⴟ 2002 ୍ 4 ᄅ 13 ರᄝ༆νࢌ๙ն࿐ࢣஇbФӫູ”
ᇏ‫ݓ‬༆҆ IT ‫ݴ‬ଛ” ྐ༏߄௜෻֥ఓ‫׮‬đѓᆽሢ໡‫ݓ‬༆֥҆ྐ༏߄ࡹഡ҄ೆಆ‫ࣉ༵ݓ‬
ྛਙb
• ೶‫ת‬ն࿐ۚྟି࠹ෘᇏྏ ቔູ‫”ࡅݓ‬211 ‫۽‬ӱ” ൮஻ᇗׄࡹഡ֥ۚ֩࿐཮ᆭ၂đ೶‫ת‬
ն࿐୍࣍ট၂ᆰᇁ৯Ⴟิۚۚྍ࠯ඌ࿹࣮ඣ௜b2004 ୍đ೶‫ת‬ն࿐๧ሧඔϤຣჭđቆ
ࡹӮ৫ਔ‫ھ‬ᇏྏb
• ฿ࣃۚྟି࠹ෘᇏྏ Ⴟ 2004 ୍ 8 ᄅ 23 ರᄝଲषն࿐Ӯ৫bᆻᄝູ฿ࣃ஡အۚྟି
࠹ෘದҌđ๷‫׮‬նܿଆ॓࿐ა‫۽‬ӱ࠹ෘ֥‫ؿ‬ᅚđఽᅝሸ‫࠯॓ކ‬ൌ৯ࣩᆚ֥ᇅۚׄb
• КࣘႋႨ໾৘ა࠹ෘඔ࿐࿹࣮෮ - ۚྟି࠹ෘᇏྏ ႚႵӑࠩѩྛ࠹ෘࠏၛࠣഈϤ෻
ۚྟି࠹ෘ‫۽‬ቔᅟđ൞‫ݓ‬ଽܿଆቋն֥ӑࠩ࠹ෘᇏྏᆭ၂bᇏྏა෮ຓࡹ৫ਔࢠܼٗ
֥࿐ඌࢌੀა‫ކ‬ቔܱ༢đӵք‫؟‬ཛ‫ࡅݓ‬ሱಖ॓࿐ࠎࣁज़ีđ‫ࡅݓ‬ᇗնࠎԤ࿹࣮ཛଢज़
ีၛࠣ‫࠯ۚࡅݓ‬ඌ࿹࣮ཛଢbᇏྏ֥ᇶေ಩ༀ൞ູ࿹࣮෮֥ۚྟି࠹ෘิ‫܂‬ཌྷܱ֥
॓࿐ა࠯ඌᆦӻđᇶေЇওğ
1. ۚྟିѩྛ࠹ෘࠏߌ࣢֥ࡹഡაܵ৘
2. ۚྟିѩྛ࠹ෘೈࡱა৘ં࿹࣮
3. նܿଆ॓࿐࠹ෘॖ൪߄ೈࡱა৘ં࿹࣮
4. նܿଆඔऌܵ৘ೈࡱა৘ં࿹࣮
5. ࠹ෘࠏຩ઎࠯ඌ֥ष‫ؿ‬აႋႨ
6. ྴ୅གྷൌ࠯ඌ࿹࣮
• ഈ‫ݚ‬ӑࠩ࠹ෘᇏྏӮ৫ა 2000 ୍ָđ൞ഈ‫ݚ‬൧ྐ༏߄ࡹഡ֥၂۱ᇗေࠎԤഡീb‫ھ‬
ᇏྏၛഈ‫ݚ‬൧֥॓࿹࢝ტ‫۽ބ‬ြ‫ؿ‬ᅚູࠎԤđູచӚஷሏଆ୅aԯѷഡ࠹֩ิ‫ྟۚ܂‬
ି࠹ෘି৯bଢభႚႵ‫ݓ‬ଽ TOP100 ஆ଀ֻ၂֥ӑࠩ࠹ෘࠏආܻ 4000Ab
• ᇏ‫॓ݓ‬࿐ჽ֥ӑࠩ࠹ෘᇏྏ Ӯ৫Ⴟ 1996 ୍đູᇏ‫॓ݓ‬࿐ჽ֥॓࿐࿹࣮ิ‫࠹܂‬ෘߌ
࣢đ൞ᇏ‫॓ݓ‬࿐ჽྐ༏߄ࡹഡ֥ᇗေࠎԤഡീᆭ၂b
1. ႗ࡱߌ࣢ğ
A 5 ຣၡՑ૫ཟຩ֥۬ӑࠩ࠹ෘࠏ༢๤ധอ 6800đЇও 265 ۱ඹਫ਼ࢲׄࠏđᇶ
௔ູ 1.3GHz ֥νอ 2 ԩ৘ྉோčఃᇏ 1024 ۱ԩ৘ࠏႨႿ࠹ෘĎđଽթሹಸ
ਈູ 2.6TBđՈ஍թԥሹಸਈູ 80TBčఃᇏđܻ༸஍ᆔಸਈ 61TBĎbۚ෎৵
ࢤຩ઎ູ QsNet(Quadrics ‫܄‬ඳӁ௖)đׄؓׄ๙ྐջॺնႿૄ૰ 300MBđ࿼
ӾൈࡗཬႿ 7 ັ૰b
B SGI Onyx 350đ32 ۱ MIPS R16000 ԩ৘ఖđᇶ௔ 600MHZĠ‫ڂ‬ᆴ 384 ၡՑ‫ׄڜ‬
§1.5 ‫ݓ‬ଽຓӑࠩ࠹ෘᇏྏሑঃ 19

ᄎෘĠI/O ջॺğ1.07GB/sčൌ࠽Ďđ2.4GB/sč‫ڂ‬ᆴĎĠթԥջॺğ3.2GB/sčൌ
࠽Ďđ3.2GB/sč‫ڂ‬ᆴĎĠଽթğ32GBĠ႗஍ğ657GBĠ๭ྙଆॶğIP ๭ྙ
वđ128M ཁթđ໕৘ଽթॖղ 104Mđ48 ໊ RGBAb
C ආܻ 2000-II ӑࠩ‫ڛ‬ༀఖğ‫ڂ‬ᆴᄎෘඔູૄ૰ 1117 ၡՑ‫ׄڜ‬ᄎෘĠଽթሹಸ
ਈ 46GBĠ႗஍ሹಸਈ 628GBđఃᇏህႨ႗஍ 405GBđ‫܋‬ཚ႗஍ 223GBĠԩ
৘ࠏሹඔູ 164 ۱Ġࢫׄሹඔູ 82 ۱b
2. ᇶေ࿹࣮ٚཟაႋႨğӑࠩ࠹ෘᇏྏ൞ູჽଽຓ॓࿹ֆ໊ิ‫܂‬ӑࠩ࠹ෘ‫ڛ‬ༀ֥ᆦ
Ӫֆ໊đᇶေՖ൙ѩྛ࠹ෘ֥࿹࣮aൌགྷࠣႋႨ‫ڛ‬ༀđѩູնܿଆ‫گ‬ᄖ࠯ඌ‫ބ‬അ
ြႋႨิ‫܂‬ॖି֥ࢳथٚσbᇏྏ֥ሷᆻ൞૫ཟ॓࿐ჽମᇀഠ߶ิ‫࣐܂‬ॖି఼֥
ۚྟି࠹ෘି৯‫࠯ބ‬ඌᆦӻđധอ 6800 ᆞൔᇿҨႨ޼ඔၘղ 112 ۱đఃᇏჽଽ
Ⴈ޼ 109 ۱đჽຓႨ޼ 3 ۱b
20 ֻ၂ᅣ ყСᆩ്
ֻ‫ؽ‬ᅣ ࠎԤѩྛෘ‫م‬

ѩྛෘ‫م‬൞ൡ‫ކ‬ᄝѩྛ࠹ෘࠏഈൌགྷ֥ෘ‫م‬b၂۱o‫֥ݺ‬pѩྛෘ‫م‬ႋ‫ܔିھ‬ԉ‫ٳ‬
‫ߨؿ‬ѩྛ࠹ෘࠏ‫؟‬ԩ৘ࠏ֥࠹ෘି৯b

§2.1 ѩྛ࠹ෘࠎЧ‫୑ۀ‬

‫ק‬ၬ 2.1.1 ৬؇ğ൞۲۱ԩ৘ࠏॖ‫׿‬৫ѩྛᆳྛ֥಩ༀնཬ֥؇ਈbն৬؇ّ႘ॖѩྛ


ᆳྛ֥ᄎෘਈնđၧӫູՙ৬؇bᆷ਷ࠩѩྛ֩ᄵ൞ཬ৬؇ѩྛđၧӫູ༥৬؇b
‫ק‬ၬ 2.1.2 ࡆ෎б: Աྛᆳྛൈࡗູ Tsđ൐Ⴈ q ۱ԩ৘ࠏѩྛᆳྛ֥ൈࡗູ Tp (q)đᄵ
ࡆ෎бູ
Ts
Sp (q) = (2.1)
Tp (q)

‫ק‬ၬ 2.1.3 ིੱ: ഡ q ۱ԩ৘ࠏ֥ࡆ෎бູ Sp (q)đᄵѩྛෘ‫ੱི֥م‬

Sp (q)
Ep (q) = (2.2)
q

‫ק‬ၬ 2.1.4 ྟି: ౰ࢤ၂۱໙ี֥࠹ෘਈູ Wđᆳྛൈࡗູ Tđᄵྟି (FLOP/s) ູ

W
Perf = (2.3)
T
ᄝ 80 ୍սđ൐Ⴈ FLOP/s ູֆ໊đ90 ୍սđ൐Ⴈ MFLOP/s ‫ ބ‬GFLOP/sđ21 ൗࡀ௴
ђ൐Ⴈ GFLOP/s ‫ ބ‬TFLOP/sđଢభ္ᇯࡶष൓൐Ⴈ PFLOP/sb
ႄ৘ 2.1.1 Amdahl ‫ੰק‬đؓၘ۳‫֥ק‬၂۱࠹ෘ໙ีđࡌഡԱྛ෮ᅝ֥Ϥ‫ٳ‬бູ αđᄵ൐
Ⴈ q ۱ԩ৘ࠏ֥ѩྛࡆ෎бູ
1
Sp (q) = (2.4)
α + (1 − α)/q

Amdahl ‫ੰק‬іૼđ֒ q ᄹնൈđSp (q) ္ᄹնb֌൞đ෱൞Ⴕഈࢸ֥b္ࣼ൞ඪđ໭ં൐


Ⴈ‫؟‬ഒԩ৘ࠏđࡆ෎֥Пඔ҂൞ିӑ‫ ݖ‬1/αb
ႄ৘ 2.1.2 Gustafson ‫܄‬ൔđࡌഡᄝૄ۱ԩ৘ࠏᇏđԱྛ҆‫֥ٳ‬Ϥ‫ٳ‬бູ αđᄵ൐Ⴈ q ۱
ԩ৘ࠏ֥ѩྛࡆ෎бູ
Sp (q) = α + q × (1 − α) (2.5)

21
22 ֻ‫ؽ‬ᅣ ࠎԤѩྛෘ‫م‬

§2.2 ѩྛෘ‫م‬ഡ࠹ࠎЧჰᄵ
ѩྛෘ‫م‬൞ѩྛ࠹ෘ֥ࠎԤđაൌགྷ࠯ඌཌྷࢲ‫ކ‬đູིۚੱ൐Ⴈѩྛ࠹ෘࠏิ‫ࢳ܂‬
थٚσbఃࠎЧჰᄵࡥඍೂ༯ğ
1. აุ༢ࢲ‫ܒ‬ཌྷࢲ‫ކ‬Ġ

๭ 2.1: ཌྟࢲ‫ܒ‬

๭ 2.2: 2 ົຩ۬ࢲ‫ܒ‬

2. ऎႵॖঔᅚྟĠѩྛෘ‫م‬൞‫ڎ‬൞ෛԩ৘ࠏ۱ඔᄹࡆ‫ܔିط‬ཌྟࠇ࣍රཌྟ֥ࡆ෎đᆃ
൞௟ࡎ၂۱ѩྛෘ‫م‬൞‫ڎ‬Ⴕི֥ᇗေѓᆽᆭ၂b္ࣼ൞ඪđೂ‫ݔ‬၂۱ѩྛෘ‫ࡆ֥م‬෎
б൞ Sp (q) = O(q) ࠇᆀ Sp (q) = O(q/(1 + log(q)))đᄵॖၛӫູऎႵॖঔᅚྟ֥ѩྛ
ෘ‫م‬b
3. ՙ৬؇Ġ๙ӈ౦ঃ༯đ৬؇ᄀնᄀ‫ݺ‬bᆃ൞ၹູᄝૄ۱ԩ৘ࠏᇏႵ‫ླ؟ޓ‬ေ࠹ෘ֥‫۽‬
ቔ಩ༀđೂՎॖၛԉ‫؟ߨؿٳ‬ԩ৘ࠏ֥ቔႨbѩྛࡆ෎бؓ༥৬؇໙ี၂Ϯ౦ঃ༯൞
҂߶‫֥ۚޓ‬đᆃ္൞ູ൉હѩྛ࠹ෘླေ౰ࢳնܿଆ໙ี֥ჰၹ෮ᄝb
4. ࡨഒ๙ྐĠ၂۱ིۚੱ֥ѩྛෘ‫م‬đ๙ྐ൞ᇀܱᇗေ֥bิۚྟି֥ܱ࡯൞ࡨഒ๙ྐ
ਈ‫ބ‬๙ྐՑඔđఃᇏ๙ྐՑඔ๙ӈ౦ঃ༯൞थ‫ק‬ၹ෍b
5. Ⴊ߄ྟିğ၂۱ෘ‫م‬൞‫ڎ‬Ⴕིđ҂ࣇ၇ঠႿ৘ં‫ٳ‬༅֥ࢲ‫ݔ‬đ္‫ބ‬ᄝൌགྷ֥‫ݖ‬ӱᇏҐ
Ⴈ֥࠯ඌ༏༏ཌྷܱbྟିᇶေुֆԩ৘ࠏି‫࠹ߨؿܔ‬ෘି৯֥Ϥ‫ٳ‬бđಖު൞ѩྛི
ੱb
႕ཙѩྛෘ‫֥ੱིم‬ၹ෍ॖି‫؟ޓ‬đ֌൞ᆃ৚෮۳ԛ่֥ࠫ൞ᇶေၹ෍bၹՎđᄝෘ
‫م‬ഡ࠹֥‫ݖ‬ӱᇏđೂ‫ࡼܔିݔ‬ഈඍ 5 ่ࡆၛር༥ॉ੮đࣼି‫ܔ‬౼֤٤ӈ‫ݔི֥ݺ‬b
§2.3 ౵თ‫ࢳٳ‬ٚ‫م‬ 23

๭ 2.3: ӑ৫ุٚࢲ‫ܒ‬

§2.3 ౵თ‫ࢳٳ‬ٚ‫م‬
‫଀ܤ‬නၬđ౵თ‫ࢳٳ‬ٚ‫م‬൞ࡼ౵თࣉྛ‫֥ࢳٳ‬၂ᇕٚ‫م‬đᄪ௹ႋႨႿ౰ࢳງჵ྘ொ
ັ‫ٳ‬ٚӱ֥၂ᇕٚ‫م‬bࡌഡ౰ࢳ֥൞इ྘౵თഈ֥ Lapalace ໙ีđ૭ඍೂ༯ğ

⎨−Δu(x, y) = f (x, y) (x, y) ∈ Ω = (0, a) × (0, b)
(2.6)
⎩u(x, y)| = g(x, y)
∂Ω

ఃᇏđf (x, y) ‫ ބ‬g(x, y) ູၘᆩ‫ݦ‬ඔđ‫ٳ‬љ‫ק‬ၬᄝ౵თ Ω ֥ଽ҆‫ބ‬шࢸb


๭ 2.4 ൞٤ᇗ‫֥ן‬౵თ‫ࢳٳ‬đᆃᇕ‫ࡼࢳٳ‬৖೛߄ު֥ٚӱ߄Ӯ၂ུ‫׿‬৫֥ཬܿଆ໙
ี‫ބ‬၂۱აૄ۱ཬ໙ีܱ৳֥ಆअ໙ีđՎᇕ‫ࢳٳ‬۳ԛ֥ٚ‫م‬൞ሰࢲ‫ܒ‬ٚ‫م‬b

(a) ၂ົ่‫ࢳٳ‬ (b) ‫ࢳٳॶົؽ‬

๭ 2.4: ਆᇕ౵თ‫ࢳٳ‬Ҧ੻

๭ 2.5 ൞ջᇗ‫֥ן‬౵თ‫ࢳٳ‬đ࠺ၼ႕҆‫֥ٳ‬౵თູ Ω1đྴཌᇀႷш֥౵თູ Ω2 bࡌ


24 ֻ‫ؽ‬ᅣ ࠎԤѩྛෘ‫م‬

ഡԚ൓ࢳູ u0đᄵॖࡼ౰ࢳٚӱ 2.6 ሇ߄ູೂ༯֥ਆ۱ཬ໙ี౰ࢳğ



⎨−Δu(x, y) = f (x, y) (x, y) ∈ Ω1
(2.7)
⎩u(x, y)| = u0∂Ω1


⎨−Δu(x, y) = f (x, y) (x, y) ∈ Ω2
(2.8)
⎩u(x, y)| = u0
∂Ω2

ؓႿૄ۱ሰ໙ี֥ࢳđླေࣉྛ࿼ຉđၛьࠆ֤ಆअࢳ֥၂۱࣍රbࡌഡٚӱ 2.7 ֥ࢳູ


u11đٚӱ 2.8 ֥ࢳູ u12đᄵॖႮೂ༯֥ٚൔ࿼ຉ෱ૌ֥ࢳູಆअࢳğ

⎨u1 = u1 ∈ Ω1
1 1
(2.9)
⎩u1 = u0 ∈ Ω − Ω
1 1


⎨u1 = u1 ∈ Ω2
2 2
(2.10)
⎩u1 = u0 ∈ Ω − Ω
2 2

ᄵྍ֥࣍රࢳູ u1 = 1/2(u11 + u12 )b

๭ 2.5: ջᇗ‫֥ן‬౵თ‫ࢳٳ‬

§2.4 ‫ࢳٳିۿ‬ٚ‫م‬
‫ࢳٳିۿ‬൞ࡼ҂๝‫ିۿ‬ቆӮ֥໙ีđοᅶః‫֥ࢳٳྛࣉିۿ‬၂ᇕ൭‫؍‬đఃଢ֥൞ᇯ
၂ࢳथ҂๝‫֥ିۿ‬໙ีđՖ‫֤ࠆط‬ᆜ۱໙ี֥ࢳbᆃ৚໡ૌ൐Ⴈ Newton ‫م‬౰ࢳ٤ཌྟ
ٚӱ 2.11 ູൕ২đࡥֆඪૼ‫֥ࢳٳିۿ‬ٚ‫م‬b
§2.5 ੀඣཌ࠯ඌ 25

ࡌഡ F (x) ൞ D ⊂ Rn ֞ D ֥၂۱႘ഝđေ౰ࢳ x∗đ൐֤ x∗ ൞ٚӱ 2.11 ֥၂۱


ࢳb
F (x) = 0 (2.11)

࠺ F (x) ֥ Jacobi इᆔູ G(x) = F  (x)đؓ۳‫֥ק‬Ԛ൓ᆴ x(0)đᄵ Newton ‫ם‬ս‫م‬


ೂ༯ğ
x(k+1) = x(k) − G−1 (x(k) )F (x(k) ), k = 0, . . . , (2.12)

ᄝᆃ۱౰ࢳ‫ݖ‬ӱᇏđླေႨ֞‫ݦ‬ඔᆴ‫֝ބ‬ඔᆴbၹՎđೂ‫ݔ‬၂҆‫ٳ‬ԩ৘ࠏ‫ڵ‬ᄳ࠹ෘ‫ݦ‬ඔ
ᆴđਸ਼၂҆‫ٳ‬ԩ৘ࠏ‫ڵ‬ᄳ࠹ෘ֝ඔᆴđࣼॖၛ֤֞၂ᇕѩྛ࠹ෘٚ‫م‬bᆃൈީ࠹ෘ൞οᅶ
‫ٳྛࣉିۿ‬஥֥đ္࠻൞෮໌֥‫ࢳٳିۿ‬b
ᄝ‫ם‬ս‫܄‬ൔ 2.12 ᇏđླေ౰इᆔ֥୉đ๙ӈᄝ࠹ෘ‫ݖ‬ӱᇏ൞ࡼఃሇ߄ູ౰ࢳཌྟս
ඔٚӱቆbࠧ౰ࢳğ
G(x(k) )δ (k) = −F (x(k) ) (2.13)

ఃᇏ δ (k) = x(k+1) − x(k) b

§2.5 ੀඣཌ࠯ඌ
ੀඣཌ࠯ඌ൞ѩྛ࠹ෘᇏ၂۱٤ӈႵི֥aӈႨ֥൭‫؍‬đᄝѩྛ࠹ෘᇏఏሢ٤ӈᇗ
ေ֥ቔႨbᆃ৚ၛ౰ࢳ၂՛‫־‬๷໙ีູ২ࡆၛඪૼb
ࡌഡေ౰ࢳ֥໙ี൞ğ

a0,j ۳‫ק‬, ai,j := F (ai−1,j ), i = 1, . . . , n, j = 1, . . . , m (2.14)

ഈඍ࠹ෘᇏđခ j ٚཟ֥࠹ෘ൞޺ཌྷ‫׿‬৫֥đ‫ط‬ခ i ٚཟ֥࠹ෘᄵթᄝሢཟభ၇ঠܱ


༢ (‫־‬๷ܱ༢)đ໭‫׿م‬৫ࣉྛb൙ൌഈđ֒ j ٚཟഈթᄝଖུ၇ঠܱ༢ (২ೂ 5 ׄҵ‫ٳ‬
۬ൔ֥ Gauss–Seidel ‫ם‬ս) ൈಯಖ൞Ⴕི֥b֒ඔऌᄝԩ৘ఖᇏ֥߃‫ࣇٳ‬ခ j ٚཟࣉ
ྛൈđ(2.14) ᇏ֥࠹ෘ൞ປಆѩྛ֥bᄝൌ࠽໙ี֥࠹ෘᇏđೂ‫ࠇົؽ‬೘ົ PDE ֥ඔ
ᆴࢳđႮႿඔऌ߃‫ٳ‬၂Ϯᄝ෮Ⴕॢࡗٚཟഈ๝ൈࣉྛđѩ౏࠹ෘ๙ӈ္ᄝ۲۱ॢࡗٚཟ
ഈࢌูࣉྛđၹՎđླေॉ੮֒ခ i ٚཟࣉྛඔऌ߃‫ٳ‬ൈ (2.14) ֥ѩྛෘ‫م‬b҂ാ၂Ϯ
ྟđ໡ૌࡌഡඔऌ߃‫ࣇٳ‬ခ i ٚཟࣉྛđࠧࡌഡᄝႵ q ۱ԩ৘ఖ֥‫҃ٳ‬ൔ༢๤ഈđai,j
Ф‫ٳ‬Ӯ q ‫؍‬đ{ai,j , i = nk , . . . , nk+1 − 1} թԥᄝԩ৘ఖ Pk ഈđk = 0, . . . , q − 1, ᆃ৚
1 = n0 < n1 < · · · < nq = n + 1b
і 2.1 ۳ԛਔੀඣཌٚ‫ ֒م‬q = 3 ൈ֥࠹ෘੀӱ:
ᆃ۱࠹ෘ‫ݖ‬ӱ္ॖၛႨ๭ 2.6 іൕđᄝᆃ۱๭ᇏđཌྷ๝࿾೤֥҆‫ٳ‬൞ॖၛѩྛ࠹ෘ
֥b
26 ֻ‫ؽ‬ᅣ ࠎԤѩྛෘ‫م‬

P0 P1 P2
ֻ 1அ ࠹ෘ ai,1 := F (ai−1,1 ), ֩րࢤ൬ an1 −1,1 ֩րࢤ൬ an2 −1,1
i = 1, . . . , n1 − 1,
‫ؿ‬ෂ an1 −1,1 ۳ P1
ֻ 2அ ࠹ෘ ai,2 := F (ai−1,2 ), ࠹ෘ ai,1 := F (ai−1,1 ), ֩րࢤ൬ an2 −1,1
i = 1, . . . , n1 − 1, i = n1 , . . . , n2 − 1,
‫ؿ‬ෂ an1 −1,2 ۳ P1 ‫ؿ‬ෂ an2 −1,1 ۳ P2
ֻ 3அ ࠹ෘ ai,3 := F (ai−1,3 ), ࠹ෘ ai,2 := F (ai−1,2 ), ࠹ෘ ai,1 := F (ai−1,1 ),
i = 1, . . . , n1 − 1, i = n1 , . . . , n2 − 1, i = n2 , . . . , n
‫ؿ‬ෂ an1 −1,3 ۳ P1 ‫ؿ‬ෂ an2 −1,2 ۳ P2

.. .. .. ..
. . . .

ֻ mஅ ࠹ෘ ai,m := F (ai−1,m ), ࠹ෘ ai,m−1 := F (ai−1,m−1 ), ࠹ෘ ai,m−2 := F (ai−1,m−2 ),


i = 1, . . . , n1 − 1, i = n1 , . . . , n2 − 1, i = n2 , . . . , n
‫ؿ‬ෂ an1 −1,m ۳ P1 ‫ؿ‬ෂ an2 −1,m−1 ۳ P2
ֻ m+1 அ ॢ༽ ࠹ෘ ai,m := F (ai−1,m ), ࠹ෘ ai,m−1 := F (ai−1,m−1 ),
i = n1 , . . . , n2 − 1, i = n2 , . . . , n
‫ؿ‬ෂ an2 −1,m ۳ P2
ֻ m+2 அ ॢ༽ ॢ༽ ࠹ෘ ai,m := F (ai−1,m ),
i = n2 , . . . , n

і 2.1: ‫־‬๷ܱ༢ൔ֥ੀඣཌ࠹ෘੀӱ

๭ 2.6: ੀඣཌ࠹ෘൕၩ๭
§2.6 ‫طٳ‬ᇍᆭٚ‫م‬ 27

§2.6 ‫طٳ‬ᇍᆭٚ‫م‬
ᆃ৚໡ૌၛ၂۱ࡥֆ֥౰‫ބ‬໙ีູ২đඪૼ൉હ൞‫طٳ‬ᇍᆭٚ‫م‬bࡌഡᄝ q = 23 ۱
ԩ৘ࠏഈ࠹ෘğ

n−1
s= ai (2.15)
i=0

ࡌഡᄝ (2.15) ᇏ֥ n = 2m  qđ࠺ s000 (0 : n) ູ sbᄵॖၛࡼ࠹ෘ s000 (0 : n) ‫ູࢳٳ‬ਆ


۱ཬ֥౰‫ބ‬໙ีđࠧğ




⎪s000 (0 : n) = s000 (0 : n/2) + s100 (n/2 : n/2)





⎪s000 (0 : n/2) = s000 (0 : n/4) + s010 (n/4 : n/4)





⎪s100 (n/2 : n/2) = s100 (n/2 : n/4) + s110 (3n/4 : n/4)

s000 (0 : n/4) = s000 (0 : n/8) + s001 (n/8 : n/8) (2.16)





⎪s010 (n/4 : n/4) = s010 (n/4 : n/8) + s011 (3n/8 : n/8)





⎪s100 (n/2 : n/4) = s100 (n/2 : n/8) + s101 (5n/8 : n/8)




⎩s110 (3n/4 : n/4) = s110 (3n/4 : n/8) + s111 (7n/8 : n/8)

k+l−1
ఃᇏ sxxx (k : l) = i=k ai ൞ᄝԩ৘ࠏ Pxxx ᇏປӮ֥࠹ෘđxxx ൞‫ࣉؽ‬ᇅඔbᆃ৚֥
࠹ෘॖၛႨ๭ 2.7 ࡥֆ֥૭ඍđᄝ๭ᇏᆺࡥֆ֥۳ԛԩ৘ࠏ‫ݼ‬b ᄝ๭ 2.7 ᇏđՖഈᇀ༯

000

000 100

000 010 100 110

000 001 010 011 100 101 110

๭ 2.7: ‫طٳ‬ᇍᆭ࠹ෘ౰‫ބ‬ൕၩ๭

൞‫ݖ֥ࢳٳ‬ӱđՖ༯ᇀഈ൞౰҆‫ݖ֥ބٳ‬ӱbᆃࣼ൞Ⴕ‫ٳ‬Ⴕᇍ֥၂۱ࡥֆ‫ݖ‬ӱđ္࠻൞၂
ᇕ‫طٳ‬ᇍᆭٚ‫م‬b‫طٳ‬ᇍᆭٚ‫م‬ᄝѩྛ࠹ෘᇏఏሢईቀ౞ᇗ֥ቔႨđࡼᄝࣂު֥ෘ‫م‬ഡ
࠹ᇏࣜӈმ֞b

§2.7 ๝҄ѩྛෘ‫م‬
ᄝᆃ၂ࢫᇏđၛ࠹ෘཌྟ‫ם‬ս໙ีč۳‫ ק‬x(0) Ď(2.17) ູ২đؓ๝҄ѩྛෘ‫ࡆم‬ၛඪ
28 ֻ‫ؽ‬ᅣ ࠎԤѩྛෘ‫م‬

ૼb
x(k+1) = b + Ax(k) (2.17)

ᆃ৚ A ൞ n × n इᆔđbax(k) ൞ n ົཟਈbࡌഡइᆔᄝԩ৘ࠏ൞οᅶྛ‫ॶٳ‬թԥ֥đ
๭ 2.8 ൞ၛ 4 ۱ԩ৘ࠏູ২֥߃‫ٳ‬bᄝૄ۱ԩ৘ࠏᇏ࠹ෘԛ x(k+1) ֥၂҆‫ٳ‬đ༯၂Ց࠹


 


         
         


         
         

         
         
        
๭ 2.8: इᆔཟਈӰ߃‫ٳ‬๭

ෘ֥ൈީླေࡼૄ۱ԩ৘ࠏ࠹ෘԛ֥҆‫ ٳ‬x(k+1) ෂ֞ః෱֥ԩ৘ࠏᇏđࣉྛྍ၂֥҄࠹


ෘbᄝᆃ۱໙ีᇏđ҂଴ुԛđູਔ࠹ෘ༯၂֥҄ྍ x(k+1)đсྶ֩֞෮Ⴕԩ৘ࠏ‫࠹׻‬ෘ
ປ҆‫ ٳ‬x(k+1) ᆭުҌିࣉྛđᆃ൞၂۱‫ླ֥྘ׅ‬ေ๝֥҄ෘ‫م‬bྸ‫؟‬ѩྛෘ‫م‬൞ᆃ၂ো
֥ෘ‫م‬đႭః൞ՖԱྛෘ‫م‬ѩྛ߄֤֥֞ն҆‫ٳ‬ෘ‫م‬උႿᆃ၂োbའభඍ֥ੀඣཌෘ‫م‬a
‫طٳ‬ᇍᆭෘ‫֩م‬đ෱ૌᄝଖᇕၩၬഈ္൞๝҄ѩྛෘ‫م‬b

§2.8 ၳ҄ѩྛෘ‫م‬
ၳ҄ѩྛෘ‫م‬൞ა๝҄ѩྛෘ‫م‬ཌྷ֥ؓđ๝҄ෘ‫م‬ᄝଖ၂ൈख़ླေაః෱֥ԩ৘ࠏ
ࣉྛඔऌࢌߐđಖުҌି࠿࿃ᆳྛbၳ҄ѩྛෘ‫ྛࣉم‬ඔऌࢌߐ҂ླေ࿸۬ಒ‫ק‬ᄝଖ၂
ൈख़đૄ۱ԩ৘ࠏοᅶყ‫࠹֥ק‬ෘ಩ༀӻ࿃ᆳྛđ֌๙ӈླေᄝ၂‫֥ק‬ൈީсྶࣉྛ၂
ՑඔऌࢌߐđၛЌᆣෘ‫֥م‬ᆞಒྟbܱႿᆃ۱ෘ‫֥م‬ൌ࠽২ሰࡼᄝइᆔѩྛ࠹ෘᇏࣉྛ
ࢺകb

§2.9 ቔြ
1. Ֆࡆ෎б֥‫ק‬ၬԛ‫ؿ‬đᆣૼ Amdahl ‫ ބੰק‬Gustafson ‫܄‬ൔb
2. ࡌഡ m × n इᆔ A ൞οਙ‫ॶٳ‬թԥᄝૄ۱ԩ৘ࠏᇏ֥đx թԥᄝԩ৘ࠏ P0 ᇏđࡌ
ഡ൐Ⴈ 4 ۱ԩ৘ࠏđࠧ A = [A0 , A1 , A2 , A3 ]đఃᇏ Ai թ٢ᄝԩ৘ࠏ Pi ᇏb൫۳ԛ
ѩྛ࠹ෘ y = Ax ֥ٚ‫م‬b
ֻ‫ٳ҆ؽ‬

ѩྛෘ‫م‬ഡ࠹აൌགྷ
ֻ೘ᅣ इᆔѩྛ࠹ෘ

ᄝ॓࿐ა‫۽‬ӱ࠹ෘ֥ྸ‫؟‬໙ีᇏ, इᆔᄎෘ, หљ൞इᆔཌྷӰa౰ࢳཌྟٚӱቆ‫ބ‬इ


ᆔหᆘᆴ໙ี൞ቋࠎЧ֥ଽ‫ނ‬. ෛሢMPP ѩྛ࠹ෘࠏ‫ބ‬ຩ઎ѩྛߌ࣢֥҂؎‫ؿ‬ᅚ, ູਔ
ԉ‫҃ٳߨؿٳ‬ൔѩྛ࠹ෘࠏ֥‫ིۿ‬, Ⴕсေؓ࠹ෘٚ‫ྛࣉم‬ധೆ֥࿹࣮. ᆃ৚ሢᇗॉ੮इ
ᆔӰࠒ‫ބ‬౰ࢳཌྟٚӱቆ֥‫؟‬ᇕѩྛෘ‫م‬, ఃཟਈ߄ෘ‫[ م‬6, 7] Ч඀ࡼ҂ቔࢺക. սඔห
ᆘᆴ໙ีࠣఃཌྷܱ໙ี֥࠹ෘٚ‫م‬ᄝ໓ང [8] ᇏႵࢠབྷ༥֥ษં, ᆃ৚ࡼ҂ቔࢺക. ູਔ
ษંٚьఏ࡮, ༵ቔ၂ུჿ‫ק‬, ࡌഡႵ p ۱ԩ৘ࠏ, Pj іൕֻ j ۱ԩ৘ࠏ, Pmyid іൕ֒
భᄎྛӱ྽֥ԩ৘ࠏ, send(x, j) ‫ބ‬recv(x, j) ‫ٳ‬љіൕᄝ Pmyid ᇏϜ x Ԯෂ֞ Pj ‫ބ‬Ֆ
Pj ᇏࢤ൬ x, Чᅣ۳ԛ֥ෘ‫׻م‬൞ᄝ Pmyid ԩ৘ࠏഈ֥. Վຓ, Ⴈ i mod p іൕ i ؓ p ౼
ଆᄎෘ.
ӱ྽ഡ࠹აࠏఖൌགྷ൞ૡ҂ॖ‫֥ٳ‬, ࠹ෘࢲ‫ߊݺ֥ݔ‬აщӱ࠯ඌႵ‫ޓ‬ն֥ܱ༢, Ⴍ
ః൞ᄝѩྛ࠹ෘࠏߌ࣢༯, ࿹ᇅۚᇉਈ֥ӱ྽ؓ‫࠹ߨؿ‬ෘࠏ֥ྟିఏሢᇀܱᇗေ֥ቔႨ.
໡ૌࢲ‫ކ‬ෘ‫م‬࿹࣮۳ԛᄝ҂๝ѩྛࠏഈ֥၂ུᇗေ২ሰটіૼӱ྽ഡ࠹නམ, ѩҐႨӱ
྽ٚൔ૭ඍෘ‫م‬, ၛ০Ⴟࠏఖൌགྷ.
ܱႿ๙ྐଆൔ, ඔऌԮൻٚൔႵྸ‫؟‬҂๝֥ࡌഡ, ᆃဢ֥ࡌഡᄝ৘ંഈษંѩྛෘ‫م‬
֥ࡆ෎бིࠣੱ൞٤ӈᇗေ֥. ؓႿཨ༏Ԯ‫྘־‬ѩྛ༢๤, ๙ӈॉ੮ఃູ: Tc = α+β ×N ,
ఃᇏ α ൞ఓ‫׮‬ൈࡗ, β ൞Ԯൻֆ໊ඔऌ෮ླ֥ൈࡗ, N ൞ඔऌ֥Ԯൻਈ.
ᄝइᆔѩྛ࠹ෘᇏ, ᇗေ֥໙ี൞इᆔᄝԩ৘ࠏᇏ֥թ٢ٚൔ, ๙ӈॉ੮इᆔᄝԩ৘
ࠏᆔਙᇏοज৺ٚൔթ٢. ࡌഡ‫ॶٳ‬इᆔ൞ 8 × 8, ԩ৘ࠏᆔਙ൞ 3 × 2, इᆔթ٢ٚൔೂ
༯: ⎛ ⎞
A00 A01 A02 A03 A04 A05 A06 A07
⎜ ⎟
⎜ A10 A11 A12 A13 A14 A15 A16 A17 ⎟
⎜ ⎟
⎜ ⎟
⎜ A20 A21 A22 A23 A24 A25 A26 A27 ⎟
⎜ ⎟
⎜ A30 A31 A32 A33 A34 A35 A36 A37 ⎟
⎜ ⎟
⎜ ⎟ (3.1)
⎜ A40 A41 A42 A43 A44 A45 A46 A47 ⎟
⎜ ⎟
⎜ ⎟
⎜ A50 A51 A52 A53 A54 A55 A56 A57 ⎟
⎜ ⎟
⎜ A60 A61 A62 A63 A64 A65 A66 A67 ⎟
⎝ ⎠
A70 A71 A72 A73 A74 A75 A76 A77

31
32 ֻ೘ᅣ इᆔѩྛ࠹ෘ

⎛ ⎞
A00 A02 A04 A06 A01 A03 A05 A07
⎜ ⎟
⎜ A30 A32 A34 A36 A31 A33 A35 A37 ⎟
⎜ ⎟
⎜ ⎟
⎜ A60 A62 A64 A66 A61 A63 A65 A67 ⎟
⎜ ⎟
⎜ A10 A12 A14 A16 A11 A13 A15 A17 ⎟
⎜ ⎟
⎜ ⎟ (3.2)
⎜ A40 A42 A44 A46 A41 A43 A45 A47 ⎟
⎜ ⎟
⎜ ⎟
⎜ A70 A72 A74 A76 A71 A73 A75 A77 ⎟
⎜ ⎟
⎜ A20 A22 A24 A26 A21 A23 A25 A27 ⎟
⎝ ⎠
A50 A52 A54 A56 A51 A53 A55 A57
ؓႿ၂Ϯ m × n ‫ॶٳ‬इᆔ‫ބ‬၂Ϯ֥ԩ৘ࠏᆔਙ p × q, ཬॶ Aij թ٢ᄝԩ৘ࠏ Pkl (k =
i mod p, l = j mod q) ᇏ.
Ֆඔᆴսඔ֥࢘؇ԛ‫ؿ‬, इᆔ࠹ෘ໙ีॖၛ߃‫ ູٳ‬4 նো:
• ཌྟսඔٚӱቆ Ax = b
• ཌྟቋཬ‫ؽ‬Ӱ໙ี minx∈Rn Ax − b2 , b ∈ Rm
• इᆔหᆘᆴ໙ี Ax = λx, Ax = λBx
• इᆔఅၳᆴ‫ ࢳٳ‬A = U ΣV T

§3.1 ѩྛइᆔӰ‫م‬
इᆔӰࠒᄝൌ࠽ႋႨᇏ൞ࣜӈေႨ֥֞, ྸ‫࠹֥ࣉ༵؟‬ෘࠏഈ‫׻‬஥Ⴕི֥ۚԱྛӱ
྽९. ູਔᄝѩྛ࠹ෘߌ࣢ഈൌགྷइᆔӰࠒ, ࿹࣮ѩྛෘ‫م‬൞٤ӈсေ֥. Чࢫေॉ੮֥
࠹ෘ໙ี൞
C =A×B (3.3)

ఃᇏ A ‫ ބ‬B ‫ٳ‬љ൞ m×k ‫ ބ‬k ×n इᆔ, C ൞ m×n इᆔ. ҂ാ၂Ϯྟ, ࡌഡ m = m̄×p,


k = k̄ × p ‫ ބ‬n = n̄ × p, ༯૫ॉ੮ࠎႿؓइᆔ A ‫ ބ‬B ֥҂๝߃‫֥ٳ‬ѩྛ࠹ෘٚ‫م‬.

§3.1.1 ԱྛइᆔӰ‫م‬

২ 3.1.1 ԱྛइᆔӰࠒሰӱ྽ (i-j-k ྙൔ)


do i=1, m
do j=1, L
do k=1, n
c(i, j) = c(i, j) + a(i, k) * b(k, j)
enddo
enddo
enddo
§3.1 ѩྛइᆔӰ‫م‬ 33

২ 3.1.2 ԱྛइᆔӰࠒሰӱ྽ (j-k-i ྙൔ)


do j=1, L
do k=1, n
do i=1, m
c(i, j) = c(i, j) + a(i, k) * b(k, j)
enddo
enddo
enddo

§3.1.2 ྛਙ߃‫ٳ‬ෘ‫م‬

ᆃ৚ࡼइᆔ A ‫ ބ‬B ‫ٳ‬љ߃‫ູٳ‬ೂ༯֥ྛॶሰइᆔ‫ބ‬ਙॶሰइᆔ:


 T  
A = AT0 AT1 ... ATp−1 , B = B0 B1 ... Bp−1 (3.4)

ᆃൈ C = (Ci,j ) = (Ai × Bj ), ఃᇏ Ci,j ൞ m̄ × n̄ इᆔ. Ai , Bi ‫ ބ‬Ci,j , j = 0, . . . , p − 1 թ


٢ᄝ Pi ᇏ, ᆃᇕթ٢ٚൔ൐ඔऌᄝԩ৘ࠏᇏ҂ᇗ‫گ‬. ᄝЧࢫ෮ॉ੮֥ෘ‫م‬ᇏ, ‫׻‬൐Ⴈᆃ
ᇕඔऌ֥թ٢ٚൔ. ႮႿ൐Ⴈ p ۱ԩ৘ࠏ, ૄՑૄ෻ԩ৘ࠏ࠹ෘԛ၂۱ Ci,j , ࠹ෘ C ླ
ေ p ՑটປӮ. Ci,j ֥࠹ෘ൞οؓ࢘ཌࣉྛ֥, ࠹ෘٚ‫م‬ೂ༯:

ෘ‫ م‬3.1.1
for i = 0 to p − 1 do
l ≡ i+myid mod p
Cl = A × B, mp1 ≡ myid+1 mod p, mm1 ≡ myid-1 mod p
if i = p − 1, send(B, mm1), recv(B, mp1)
end{f or}
ᄝᆃ۱ෘ‫م‬ᇏ, Cl = Cmyid,l , A = Amyid , B ᄝԩ৘ࠏᇏૄՑ࿖ߌཟభ၍‫׮‬၂۱ԩ৘ࠏ,
ૄՑࢌߐඔऌູ k × n̄ इᆔ, ࢌߐՑඔູ p − 1 Ց. ೂ‫ݔ‬Ⴈ DTA1 іൕᄝෘ‫ م‬3.1.1
ᇏඔऌ֥ࢌߐਈ, CA1 іൕᄝෘ‫ م‬3.1.1 ᇏ֥࠹ෘਈ, ᄵႵ DTA1 = 2 × k × (n − n̄),
CA1 = m × k × n/p.

§3.1.3 ྛྛ߃‫ٳ‬ෘ‫م‬

ᆃ৚ࡼइᆔ A ‫ ބ‬B न߃‫ॶྛູٳ‬ሰइᆔ, इᆔ A ֥߃‫ٳ‬๝ൔ (3.4), B ֥߃‫ٳ‬ೂ


༯:  T
B= B0T B1T ... Bp−1
T (3.5)

Ci ູ‫ ބ‬Ai ཌྷؓႋ֥ C ֻ֥ i ۱ॶ, ࣉ၂҄Ϝ Ai οਙ‫ॶٳ‬ა B ֥ྛ‫ॶٳ‬ཌྷؓႋ, ࠺


 
Ai = Ai0 Ai1 . . . Ai,p−1
34 ֻ೘ᅣ इᆔѩྛ࠹ෘ

Ֆ‫ط‬Ⴕ

p−1
Ci = Ai × B = Ai,j × Bj
j=0

Ԛ൓ඔऌ A, B ‫ ބ‬C ֥թ٢ٚൔა 3.1.2 ཌྷ๝, ᄝࢲׄ Pmyid ഈ֥࠹ෘ‫ݖ‬ӱॖ݂ବູෘ


‫ م‬3.1.2.

ෘ‫ م‬3.1.2
for i = 0 to p − 1 do
l ≡ i+myid mod p
C = C + Al × B, mp1 ≡ myid+1 mod p, mm1 ≡ myid-1 mod p
if i = p − 1, send(B, mm1), recv(B, mp1)
end{f or}
ᆃ۱ෘ‫م‬ᇏ֥ඔऌࢌߐਈ‫࠹ބ‬ෘਈაෘ‫ م‬3.1.1 ཌྷ๝, ෮҂๝֥ᆺ൞࠹ෘ C ֥ٚൔ,
ఃᇏ Al = Amyid,l .

§3.1.4 ਙਙ߃‫ٳ‬ෘ‫م‬

ᆃ৚ࡼइᆔ A ‫ ބ‬B न߃‫ູٳ‬ਙॶሰइᆔ, B ֥߃‫ٳ‬აൔ (3.4) ཌྷ๝, A ߃‫ູٳ‬ೂ༯


ྙൔ:  
A= A0 A1 ... Ap−1 (3.6)

ᆃൈ C ֥߃‫ٳ‬ა B ֥߃‫ٳ‬ཌྷؓႋ,
 ္൞οਙ‫֥ॶٳ‬, ࣉ၂҄Ϝ Bi οྛ‫ٳ‬Ӯა A ֥ਙ
T
T
‫ॶٳ‬ཌྷؓႋ֥ྛ‫ॶٳ‬, ࠺ Bi = Bi0 T T , Ֆ‫ط‬Ⴕ༯૫࠹ෘ C ֥ٚ‫م‬.
Bi1 . . . Bi,p−1


p−1
Cj = A × Bj = Ai × Bi,j
i=0

ᆃൈ֥࠹ෘ‫ݖ‬ӱ൞Ԯෂइᆔ A ‫ط‬҂൞ B, ऎุ֥ෘ‫م‬૭ඍೂ༯:

ෘ‫ م‬3.1.3
for i = 0 to p − 1 do
l ≡ i+myid mod p
C = C + A × Bl , mp1 ≡ myid+1 mod p, mm1 ≡ myid-1 mod p
if i = p − 1, send(A, mm1), recv(A, mp1)
end{f or}
ෘ‫ م‬3.1.3 ֥࠹ෘਈაෘ‫ م‬3.1.1 ‫ބ‬ෘ‫ م‬3.1.2 ൞ཌྷ๝֥, ෘ‫ م‬3.1.3 ֥ඔऌࢌߐਈ
൞ DTA3 = 2 × m × (k − k̄). ֒ m = n ൈ, DTA1 = DTA3 . ਆᇕෘ‫م‬ඔऌࢌߐਈ֥նཬ
§3.1 ѩྛइᆔӰ‫م‬ 35

൞Ⴎ m ‫ ބ‬n थ‫֥ק‬, ࠧ֒ m ≤ n ൈ, DTA3 ≤ DTA1 . ႮႿ෱ૌ֥࠹ෘਈ൞ཌྷ๝֥, ၹ


Վᆺေο๙ྐਈնཬ࿊ᄴෘ‫ࣼم‬ॖၛ֤֞‫֥ݺ‬ѩྛིੱ.

§3.1.5 ਙྛ߃‫ٳ‬ෘ‫م‬

ᆃ৚ࡼइᆔ A ‫ ބ‬B ‫ٳ‬љ߃‫ູٳ‬ਙ‫ॶྛބ‬ሰइᆔ, A ֥߃‫ٳ‬აൔ (3.6) ཌྷ๝, B ֥߃


‫ٳ‬აൔ (3.5) ཌྷ๝. ႮՎ֤֞

p−1
C =A×B = Ai × Bi
i=0

C ֥࠹ෘ൞๙‫ ݖ‬p ۱ܿଆ‫ ބ‬C ཌྷ๝֥इᆔᆭ‫֥֤֞ބ‬, Ֆؓ໙ี֥߃‫ٳ‬ॖၛुԛ, ѩ


ྛෘ‫࡯ܱ֥م‬൞࠹ෘइᆔ֥‫ބ‬, ഡ࠹Ⴕֹི࠹ෘइᆔ‫֥ބ‬ෘ‫م‬, ؓ‫҃ٳߨؿ‬ൔѩྛ༢๤

ི֥ੱఏሢᇗေቔႨ. ࡌഡࢲ‫ݔ‬इᆔ C ္൞οਙ‫ॶٳ‬թ٢ᄝԩ৘ࠏᇏ֥đ ࠺ Bi =


Bi0 Bi1 . . . Bi,p−1 ᄵႵ

p−1
Cj = Ai × Bij
i=0
ၹՎđ໡ૌࣼॖၛ۳ԛೂ༯֥ෘ‫م‬ğ

ෘ‫ م‬3.1.4
C = A × Bmyid
for i = 1 to p − 1 do
l ≡ i+myid mod p, k ≡ myid − imodp
T = A × Bl
send(T , l), recv(T , k)
C =C +T
end{f or}
ᆃ৚۳ԛ֥ෘ‫م‬൞ࡥࢱၞ‫׭‬, ః๙ྐਈ DTA4 = 2 × m × (n − n̄). ೂ‫ݔ‬ҐႨοྛ‫ٳ‬
ॶٚൔ࠹ෘ C, ෘ‫ م‬3.1.4 ္๝ဢൡ‫ކ‬, ౏๙࿟ਈ္൞҂э֥đၹՎ࿊ᄴ‫ޅ‬ᇕٚൔ࠹ෘ C
ॖ۴ऌླေ‫קط‬.

§3.1.6 Cannon ෘ‫م‬

ࡌഡइᆔ A, B ‫ ބ‬C ॖၛ‫ٳ‬Ӯ m × m ॶइᆔ, ္ࠧ, A = (Aij )m×m , B = (Bij )m×m ,


‫ ބ‬C = (Cij )m×m , ఃᇏ Aij , Bij ‫ ބ‬Cij ൞ n × n इᆔ, ࣉ၂҄ࡌ‫ק‬Ⴕ p = m × m ۱ԩ৘
ࠏ. ູਔษં Cannon ෘ‫م‬, ႄೆॶᇂߐइᆔ Q = (Qij ) ൐֤

In , j ≡ i + 1 mod m
Qij =
0n , ః෱౦ঃ
36 ֻ೘ᅣ इᆔѩྛ࠹ෘ

(l) (l)
ఃᇏ In ‫ ބ‬0n ‫ٳ‬љ൞ n ࢨֆ໊इᆔ‫ބ‬ਬइᆔ. ‫ק‬ၬؓ࢘ॶइᆔ DA = diag(Di ) =
m−1 (l)
diag(Ai,i+l mod m ), ಸၞ๷֝ԛ A = l=0 DA × Ql . ၹՎ


m−1
(l)

m−1
(l)
C =A×B = DA × Ql × B = DA × B (l)
l=0 l=0

ఃᇏ B (l) = Ql × B = Q × B (l−1) . ০Ⴈᆃ۱‫־‬๷ܱ༢ൔ, ѩϜԩ৘ࠏࢲׄщ‫ݼ‬Ֆ၂ົ႘


ഝ֞‫ົؽ‬, ࠧႵ Pmyid = Pmyrow,mycol , ඔऌ Aij ,Bij , ‫ ބ‬Cij թ٢ᄝ Pij ᇏ, ಸၞ֤֞༯૫
֥ᄝԩ৘ࠏ Pmyid ࢲׄഈ֥ෘ‫م‬.

ෘ‫ م‬3.1.5
C=0
for i = 0 to m − 1 do
k ≡ myrow+i mod m; mp1 ≡ mycol+1 mod m; mm1 ≡ mycol-1 mod m;
if mycol=k then
send(A, (myrow, mp1)); copy(A, tmpA);
else
recv(tmpA, (myrow, mm1));
if k = mp1, send(tmpA, (myrow, mp1));
end{if }
C = C+tmpA ×B; mp1 ≡ myrow+1 mod m; mm1 ≡ myrow-1 mod m;
if i = m − 1 then
send(B, (mm1, mycol)); recv(B, (mp1, mycol));
end{if }
end{f or}
‫ھ‬ෘ‫م‬ऎႵ‫ڵ֥ݺޓ‬ᄛ௜‫ޙ‬, ఃหׄ൞ᄝ๝၂ྛᇏܼѬ A, ࠹ෘԛ C ֥҆‫ٳ‬ᆴᆭު,
ᄝ๝ਙᇏ‫ ׮ݏ‬B. ඔऌࢌߐਈ DTA5 = m × 2 × n2 + (m − 1) × 2 × n2 = 2(2m − 1)n2 =

4m2 n2 / p − 2m2 n2 /p. ႮႿ࠹ෘਈؓૄ۱ԩ৘ࠏটඪ൞ཌྷ๝֥, ၹՎᄝ࿊ᄴෘ‫م‬ൈᆺླ
ॉ੮๙ྐਈ. Ֆ෮۳ԛ֥ᆃ໴۱ѩྛ࠹ෘइᆔӰࠒ֥ෘ‫م‬ॖၛु֞, ؓႿٚᆔ֥Ӱࠒ, ֒
p ≥ 4 ൈ, Cannon ෘ‫م‬ऎႵႪᄀྟ.

§3.2 ཌྟսඔٚӱቆѩྛ౰ࢳٚ‫م‬
ཌྟٚӱቆ൞ྸ‫؟‬ᇗေ໙ี֥‫ྏނ‬, ၹՎႵֹི౰ࢳཌྟٚӱቆᄝ॓࿐ა‫۽‬ӱ࠹ෘ
ᇏ൞٤ӈᇗေ֥. ѩྛ࠹ෘࠏ֥໙ൗ, ൐౰ࢳ໙ี֥෎؇‫ܿีࢳބ‬ଆն‫ږ‬؇ֹิۚ, ๝
§3.2 ཌྟսඔٚӱቆѩྛ౰ࢳٚ‫م‬ 37

ൈ္൐࠹ෘٚ‫م‬Ӂളਔэ߄. ᄝԮ๤֥Աྛࠏഈ, Linpack ൞౰ࢳཌྟٚӱቆ֥Ⴕིೈࡱ


Ї. ಖ‫ط‬ᄝѩྛࠏഈ౰ࢳՎ໙ี, ࣼླေഡ࠹ԛൡ‫ކ‬Ⴟ‫֥ࠏھ‬ѩྛෘ‫م‬, ෘ‫֥م‬Ⴊਜ߶ؓ
ѩྛࠏི֥ੱӁള‫ޓ‬ն֥႕ཙ. ᆃ৚ॉ੮֥໙ี൞

Ax = b

ᆃ৚֥಩ༀॖၛ‫ູٳ‬ਆٚ૫, ၂ٚ૫൞ѩྛ࠹ෘइᆔ A ֥LU ‫ࢳٳ‬, ఃᇏ L,U ‫ٳ‬љ൞༯


೘࢘‫ބ‬ഈ೘࢘इᆔ, ္ࠧթᄝ၂ஆਙइᆔ Q, ൐ AQ = LU . ਸ਼၂ٚ૫൞ѩྛ౰ࢳ೘࢘ྙ
ٚӱቆ, ࠧ, ౰ࢳٚӱቆ Ly = b ‫ ބ‬U x = y. ༯૫໡ૌ૭ඍႵܱ֥ෘ‫م‬.

§3.2.1 ‫҃ٳ‬ൔ༢๤֥ѩྛ LU ‫ࢳٳ‬ෘ‫م‬

൮༵ॉ੮ n × n इᆔ A = (aij ) ֥ԱྛLU ‫مࢳٳ‬. ۴ऌ౰ࢳཌྟٚӱቆ֥ླေ, Ґ


Ⴈ҆‫ٳ‬࿊ᇶჭ֥ Gauss ཨಀ‫م‬, ࣉྛਙཨಀ, ൐֤ L ൞ֆ໊༯೘࢘इᆔ. ᄝෘ‫م‬ᇏ ak і
ൕ A ֻ֥ k ྛ.

ෘ‫ م‬3.2.1
for j = 0 to n − 2 do
find l: |alj | = max{|aij |, i = j, . . . , n − 1}
if l = j, swap Aj and Al
if ajj = 0, A is singular and return
aij = aij /ajj , i = j + 1, . . . , n − 1
for k = j + 1 to n − 1 do
aik = aik − aij × ajk , i = j + 1, . . . , n − 1
end{f or}
end{f or}
ᄝෘ‫ م‬3.2.1 ᇏ, ᇶေ࠹ෘ‫۽‬ቔਈ൞ྩᆞइᆔ A, ࠧቓ aik − aij × ajk , ၹՎѩྛ࠹ෘ
֥ᇶေ಩ༀࣼ൞ᄝ‫؟‬ԩ৘ࠏഈ๝ൈؓइᆔ A ֥҂๝҆‫ٳ‬ቓྩᆞ. ᄝ‫؟‬ԩ৘ࠏഈ LU ‫ٳ‬
ࢳ֥ᇗေ‫۽‬ቔ൞൐ᄛ‫࣐ހ‬ॖି֥௜‫ޙ‬, ໡ૌҐႨज৺ (wrap) թԥٚൔᄝ۲ԩ৘ࠏഈ‫ٳ‬஥
इᆔ A, Ϝइᆔ A ֻ֥ i ਙթ٢ᄝ Pi mod p ᇏ. ࡌഡ n = p × m, ᄝ༯૫ෘ‫م‬ᇏ A ֻ֥
i ਙູჰট A ֻ֥ i × p + myid ਙ, इᆔᄝԩ৘ࠏᇏ֥թ٢ٚൔູ:

A00 A0p ··· A01 A0,p+1 ··· A02 A0,p+2 ··· ···
A10 A1p ··· A11 A1,p+1 ··· A12 A1,p+2 ··· ···
.. .. .. .. .. .. .. .. .. .. (3.7)
. . . . . . . . . .
An−1,0 An−1,p · · · An−1,1 An−1,p+1 · · · An−1,2 An−1,p+2 · · · · · ·
༯૫۳ԛᄝ Pmyid ഈ֥ࢲׄ૭ඍ.
38 ֻ೘ᅣ इᆔѩྛ࠹ෘ

ෘ‫ م‬3.2.2
icol= 0
for j = 0 to n − 2 do
if myid=j mod p then
find l: |al,icol | = max{|ai,icol |, i = j, . . . , n − 1}
if l = j, swap aj,icol and al,icol
if aj,icol = 0, A is singular and kill all processes
ai,icol = ai,icol /aj,icol , i = j + 1, . . . , n − 1
fi−j−1 = ai,icol , i = j + 1, . . . , n − 1
send(l, myid+1) and send(f , myid+1)
icol+1 → icol
else
recv(l, myid-1) and recv(f , myid+1)
if myid+1 = j mod p, send(l, myid+1) and send(f , myid+1)
end{if }
if l = j, swap Aj and Al
for k=icol to m − 1 do
aik = aik − fi × ajk , i = j + 1, . . . , n − 1
end{f or}
end{f or}
ෘ‫ م‬3.2.2 ൞ᄝ‫҃ٳ‬ൔѩྛ࠹ෘࠏഈቓ LU ‫֥ࢳٳ‬Ⴕིٚ‫م‬ᆭ၂, ໡ૌᄝ‫ݓ‬Ӂѩྛ
ࠏഈቓਔྸ‫؟‬ൌဒ, ི‫ݺޓݔ‬. ೂ‫ݔ‬ҐႨ‫ॶٳ‬ज৺ٚൔթԥ, ᄹնਔෘ‫֥م‬৬؇, ི‫ݔ‬۷
‫ݺ‬.

§3.2.2 ೘࢘ٚӱቆ֥ѩྛࢳ‫م‬

Чࢫॉ੮೘࢘ٚӱቆ֥ѩྛ࠹ෘٚ‫م‬, ໡ૌ҂ٞࣇษંࢳ༯೘࢘ٚӱቆ Lx = b. ೘
࢘ٚӱቆ֥ѩྛ౰ࢳؓႵི֥ѩྛ౰ࢳཌྟٚӱቆ൞҂ॖಌഒ֥, ෱֥ѩྛི‫ߊݺ֥ݔ‬
ؓ౰ࢳᆜ۱໙ีႵᆰࢤ֥႕ཙ, ᆃ৚۳ԛਆᇕѩྛൌགྷٚ‫م‬. ൮༵۳ԛ၂۱Աྛෘ‫م‬.

ෘ‫ م‬3.2.3
for i = 0 to n − 1 do
xi = bi /lii
for j = i + 1 to n − 1 do
bj = bj − lji × xi
§3.2 ཌྟսඔٚӱቆѩྛ౰ࢳٚ‫م‬ 39

end{f or}
end{f or}

ᄝᆃ۱ෘ‫م‬ᇏૄՑؓ b ࣉྛྩᆞൈႨ֞ L ֥၂ਙ, ೂ‫ݔ‬οᆃᇕٚൔѩྛྩᆞ b, ᄵ


ӫᆭູਙೡ૭ٚ‫م‬. ؓႿਙೡ૭ෘ‫م‬, ჰ൓ඔऌ L ൡ‫ކ‬Ⴟοྛթ٢, ֒ྩᆞ b ֥ᆴൈ, ࣼ
ॖၛѩྛ࠹ෘ. ๝ൈູ൐ૄ۱ԩ৘ࠏ֥‫۽‬ቔਈ࣐ॖିन‫ޙ‬, ေҐ౼ज৺ٚൔթ٢ඔऌ. ᆞ
ೂ໡ૌ෮૭ඍ֥, ູਔൌགྷѩྛ࠹ෘ, ླေࡼૄ҄࠹ෘԛট֥ࢳ֥၂۱‫ٳ‬ਈԮෂ֞෮Ⴕః
෱ԩ৘ࠏᇏ, ః๙ྐՑඔ൞‫֥؟ޓ‬, ᆃؓႿཨ༏Ԯ‫྘־‬ѩྛ༢๤൞҂෾ൡ‫֥ކ‬. ֌൞ؓႿ
Ⴕ‫܋‬ཚթԥ֥༢๤൞ॖၛҐႨᆃᇕ࠹ෘٚσ֥. ཞభ၂ࢫᇏቓ LU ‫ࢳٳ‬ൈ၂ဢ, ླေႄ
ࣉ‫܋‬ཚэਈ flag ‫ ބ‬gb, ᆃൈᄝ‫܋‬ཚթԥ༢๤ഈ֥ෘ‫م‬ॖ૭ඍӮೂ༯ྙൔ:

ෘ‫ م‬3.2.4
k=0
for i = 0 to n − 1 do
if myid ≡ i mod p then
gbi = bk /lki , flagi = 1, k + 1 → k
end{if }
if flagi = 1, wait
for j = k to m − 1 do
bj = bj − lji × gbi
end{f or}
end{f or}

ᆃ൞၂ᇕ٤ӈሱಖ֥ѩྛൌགྷٚ‫م‬, ֌൞ູࡨഒ֩ր, ॖၛҐႨྩᆞ b ֥၂۱‫ٳ‬ਈ

ࣼ࠹ෘ༯၂۱ࢳ֥ٚൔ, ᆃဢః෱֥ԩ৘ࠏᄝቓ༯၂ՑྩᆞൈࣼၘࣜႵਔေႨ֥ྍᆴ, ‫ط‬

҂ླေ֩ր. ᆃུ‫׻‬൞ෘ‫م‬აӱ྽ഡ࠹ൈႋ‫ھ‬ᇿၩ֥࠯ె, ّ‫گ‬൫ဒࣼ߶Ⴕ෮ุ߶. ᄝն

҆‫ٳ‬གྷႵ֥‫܋‬ཚթԥѩྛ༢๤ഈ, ‫܂ิ׻‬ਔ๝҄ࠏᇅ, ᄝෘ‫م‬ᇏ่ࡱ஑؎֥֩ր္ॖၛႮ

༢๤ิ‫֥܂‬९‫ݦ‬ඔটൌགྷ, ࠧᄝՎ๝҄. ֌ؓҐႨၳ҄ٚൔ࠹ෘ༯၂۱ྍࢳ֥ෘ‫ࣼم‬҂ൡ

‫ކ‬ਔ, ᆃൈࣼႋႨ໡ૌᄝෘ‫م‬ᇏ۳ԛ่֥ࡱ஑؎֥֩րটൌགྷ. ༯૫ࢺക၂ᇕᄝ‫҃ٳ‬ൔ

ѩྛࠏഈ֥༯೘࢘ٚӱቆ֥౰ࢳٚ‫م‬, ‫ھ‬ٚ‫م‬ҐႨοਙज৺ٚൔթ٢ඔऌ, ૄՑԮ‫֥־‬൞


40 ֻ೘ᅣ इᆔѩྛ࠹ෘ

҆‫ྩٳ‬ᆞ֥Ⴗ؊ཛ, ‫ط‬҂൞ྍ౰ԛ֥ࢳ, ๙‫֥ࡆןݖ‬ٚൔ࠹ෘ༯Ց֥ྍࢳ. ᆃ۱ෘ‫م‬ᄝ‫ٳ‬

҃ൔ༢๤ഈФܼٗႋႨ, ൞٤ӈႵི֥ѩྛෘ‫م‬. ೂ๭൞൐Ⴈ 3 ۱ԩ৘ࠏ౰ࢳ༯೘࢘ཌ

ྟսඔٚӱቆ֥ѩྛ࠹ෘ‫ݖ‬ӱ:


∗ ∗
∗ ∗ ∗
∗ ∗ ∗
∗ ∗ ∗
∗ ∗ ∗
(3.8)
∗ ∗ ∗
∗ ∗ ∗
∗ ∗ ∗
∗ ∗ ∗
∗ ∗ ∗
∗ ∗ ∗
ఃෘ‫֥م‬ऎุ૭ඍྙൔೂ༯:

ෘ‫ م‬3.2.5
k=0
if myid=0, then
ui = bi , i = 0, . . . , n − 1, vi = 0, i = 0, . . . , p − 2
else
ui = 0, i = 0, . . . , n − 1
for i = 0 to n − 1 do
§3.3 ؓӫᆞ‫ק‬ཌྟٚӱቆ֥ѩྛࢳ‫م‬ 41

if i > 0, recv(v, i − 1 mod p)


xk = (ui + v0 )/lik
vj = vj+1 + ui+1+j − li+1+j,k × xk , j = 0, . . . , p − 3
vp−2 = ui+p−1 − li+p−1,k × xk
send(v, i + 1 mod p)
uj = uj − ljk × xk , j = i + p, . . . , n − 1
k+1→k
end{f or}

ܱႿᆃ۱ෘ‫֥م‬བྷ༥ษંॖҕ࡮໓ང [10].

§3.3 ؓӫᆞ‫ק‬ཌྟٚӱቆ֥ѩྛࢳ‫م‬
ؓႿؓӫᆞ‫ק‬इᆔ A ֥ LU ‫ࢳٳ‬, ໡ૌҐႨCholesky ‫ࢳٳ‬, ္ࠧ A = RT R, ఃᇏ R
൞ഈ೘࢘इᆔ. ႮႿ೘࢘ٚӱቆ֥౰ࢳᄝభ၂ࢫᇏၘࣜ۳ԛ, ၹՎᆃ৚ሢᇗॉ੮ؓӫᆞ
‫ק‬इᆔ֥Cholesky ‫ࢳٳ‬. ၂۱ٚ‫م‬൞ᄝԮ๤֥ Cholesky ‫ࢳٳ‬ਙ۬ൔෘ‫ࠎ֥م‬Ԥഈ, ؓႿ
‫ؿ‬ෂඔऌ҂ླ֩ր֥ѩྛ༢๤, ิԛ֥ѩྛෘ‫م‬. ਸ਼၂۱ٚ‫م‬൞Ⴈච౷࿈ሇэߐ֥ٚൔ
টቓ Cholesky ‫ࢳٳ‬. ༯૫ࣼ‫ٳ‬љࢺകᆃਆᇕෘ‫م‬.

§3.3.1 Cholesky ‫ࢳٳ‬ਙ۬ൔ֥ѩྛ࠹ෘ

ᆃ৚۳ԛ֥ѩྛ Cholesky ‫ࢳٳ‬ෘ‫م‬, ൞ᄝԮ๤֥ Cholesky ‫ࢳٳ‬ਙ۬ൔෘ‫ࠎ֥م‬Ԥഈ,


ࢲ‫҃ٳކ‬ൔѩྛ࠹ෘࠏ༢๤֥หׄ۳ԛ֥ [11] . ෱൞ᄝ‫҃ٳ‬ൔ‫؟‬ԩ৘ࠏ༢๤ഈ౰ Cholesky
‫֥ࢳٳ‬Ⴕིෘ‫م‬. ൮༵ՖԱྛෘ‫م‬ԛ‫ؿ‬

ෘ‫ م‬3.3.1
for j = 0 to n − 1 do

j−1

ajj = ajj − ajk × ajk , ajj = ajj
k=0
for i = j + 1 to n − 1

j−1
aij = (aij − ajk × aik )/ajj
k=0
end{f or}
end{f or}

ᄝᆃ۱ෘ‫م‬ᇏ, इᆔ RT թ٢ᄝაइᆔ A ཌྷؓႋ֥༯೘໊࢘ᇂ, ෱ؓႿ j ࿖ߌটඪ,


ૄՑ࠹ෘԛ RT ֥၂ਙ, ‫ܣ‬ӫᆭູਙ۬ൔෘ‫م‬. ႮႿֻ j ਙ֥࠹ෘႨ֞భ૫֥ j ਙ֥ᆴ,
ၹՎᄝѩྛ࠹ෘ R ൈࣼေϜ෱ᆭభ֥ਙ֥ྐ༏Ԯෂ֞‫ھ‬ਙ෮ᄝ֥ࢲׄഈ. ᄝ‫ھ‬Աྛෘ‫م‬
42 ֻ೘ᅣ इᆔѩྛ࠹ෘ

֥ࠎԤഈ, ႄೆ‫ࢳٳ‬ၹሰэਈ F , ෱࠺੣֒భԩ৘ࠏᆭభ֥ p − 1 ۱ԩ৘ࠏഈ֥‫ࢳٳ‬ၹ


ሰ, ൞ (p − 1) × n इᆔ, ჰ൓इᆔ A οྛज৺ٚൔթ٢ᄝԩ৘ࠏᇏ, ᄵᄝࢲׄ Pmyid ഈ
֥ෘ‫م‬ೂ༯:

ෘ‫ م‬2
for i = 0 to m − 1 do
k = i × p + myid, l = k − p + 1
if k > 0 then, recieve G from Pmyid−1
for j = 0 to p − 2 do

j+l−1
ai,j+l = (ai,j+l − ait × gjt )/gj,j+l
t=0
Fj = Gj+1
end{f or}

k−1
aik = aik − ait × ait
√ t=0
aik = aik , Fp−2 = Ai
Send F to Pmyid+1
for e = i + 1 to m − 1 do
for j = 0 to p − 2 do

j+l−1
ae,j+l = (ae,j+l − aet × gjt )/gj,j+l
t=0

k−1
aek = (aek − aet × ait )/aik
t=0
end{f or}
end{f or}

ᆃ۱ѩྛෘ‫֥م‬หׄ൞ૄ҄࠹ෘԛ RT ֥ p ਙ, ᄝ๝၂࿖ߌᇏ, ۲ԩ৘ࠏ࠹ෘԛ֥


RT ֥ p ਙ൞҂ཌྷ๝֥, Ֆ‫ط‬ൌགྷ࠹ෘა๙ྐ֥ၳ҄ࣉྛ, ࡨഒԩ৘ࠏ֥֩ր. ৘ં‫ٳ‬༅
აඔᆴ࠹ෘࢲ‫ݔ‬ॖҕ࡮໓ང [11].

§3.3.2 ච౷эߐ Cholesky ‫ࢳٳ‬

ච౷эߐCholesky ‫ࢳٳ‬൞ᆷቓ Cholesky ‫ࢳٳ‬ൈ൐Ⴈೂ༯֥ච౷эߐ:


 
coshφ sinhφ
H=
sinhφ coshφ

ᄝ໡ૌ֥ෘ‫م‬ᇏ, ൐Ⴈ༯૫֥ྙൔ:
 
1
2 −2 1 −ρ
H = (1 − ρ )
−ρ 1
§3.3 ؓӫᆞ‫ק‬ཌྟٚӱቆ֥ѩྛࢳ‫م‬ 43

ఃᇏ ρ = tanh(−φ). ๙‫ݖ‬ᆃ۱эߐϜइᆔ A ߄Ӯ RT R, ൮༵໡ૌՖ෱֥ࠎЧ৘ંष൓.


ࡌഡ A = D + U T + U , ఃᇏ D ൞ؓ࢘इᆔ,U ൞࿸۬ഈ೘࢘इᆔ, ࠺ W = D−1/2 U ,
‫ ބ‬V = D1/2 + W . ๙‫ࡥݖ‬ֆ֥๷֝Ⴕ

A = V TV − WTW

Ֆ‫ط‬Ⴕ༯૫֥ܱ༢ൔӮ৫:
     
  I 0 R   I 0 V
RT 0 = V T WT
0 −I 0 0 −I W

ఃᇏ I ൞ n × n ֆ໊इᆔ, ູቓච౷эߐ Cholesky ‫ࢳٳ‬, ေႨ֞༯૫֥၂ུ‫ק‬ၬაႄ৘.


‫ק‬ၬ 3.3.1 ೂ‫ݔ‬၂۱ 2m × 2m इᆔ Θ ડቀ༯૫֥ܱ༢ൔ:
   
I 0 I 0
ΘT Θ=
0 −I 0 −I

ఃᇏ I ൞ m × m ֆ໊इᆔ, ᄵӫᆭູ൞ເᆞࢌ֥ (pseudo-orthogonal) इᆔ.


Ֆᆃ۱‫ק‬ၬॖၛु֞, ೂ‫ݔ‬թᄝ၂۱ເᆞࢌइᆔ Q ൐֤
   
V R
Q =
W 0

ପહՖభ૫֥ܱ༢ൔᇏࣼॖ֤ԛ A = RT R, ၹՎᇶေ಩ༀࣼ൞࿙ᅳເᆞࢌइᆔ Q. ༯૫
҂ࡆᆣૼֹਙԛ໓ང [12] ᇏ֥ႄ৘.
ႄ৘ 3.3.1 ೂ‫ ݔ‬R ‫ ބ‬S ‫׻‬൞ n × n ഈ೘࢘इᆔ, ൐֤ RT R − S T S ؓӫᆞ‫ק‬, ᄵ R ൞
ॖ୉֥, ѩડቀ:
−1
| skk rkk |< 1, 1≤k≤n

ႄ৘ 3.3.2 ೂ‫ ݔ‬R ‫ ބ‬S ‫׻‬൞ n × n ഈ೘࢘इᆔ, ൐֤ RT R − S T S ؓӫᆞ‫ק‬, ѩ਷


(n) Q
ρk ≡ skk r−1 , 1 ≤ k ≤ n, Q̂ = Q (1) , ఃᇏ Q
(n−1) · · · Q (k) ֥ჭ෍‫ק‬ၬೂ༯:
kk


⎪ 1, i = j = k ࠇ i = j = n + k


⎨ (1 − ρ2 )− 12 , i=j =k ࠇ i=j =n+k
(k) k
q̃ij = 1
⎪ −(1 − ρ2k )− 2 ρk ,
⎪ (i, j) = (k, n + k) ࠇ (i, j) = (n + k, k)



0, ః෱
   
R  R
Վຓ, ೂ‫ݔ‬ = Q̂ , ᄵ Q̂  ൞ഈ೘࢘इᆔ, S ൞࿸۬ഈ
൞ເᆞࢌइᆔ, ѩ౏ R
S S
೘࢘इᆔ.
44 ֻ೘ᅣ इᆔѩྛ࠹ෘ

(k) ֥‫ק‬ၬॖၛु֞, ෱൞ቔႨᄝ R ‫ ބ‬S ֻ֥ k ྛ֥၂۱эߐ, ೂ‫ݔ‬


ՖQ
 
− 1 1 −ρ k
Hk = (1 − ρ2k ) 2
−ρk 1
   
Rk (k) R (k) ൞၂۱
ᄵ Hk აQ ֻ֥ k ྛ‫ ֻބ‬k + n ྛ൞ཌྷ๝֥. ႮՎ໡ૌඪ Q
Sk S
࿈ሇэߐ.
ࡌഡ Q ൞ n × n ࿖ߌᇂߐइᆔ, ఃᇏ p1,n = 1 ‫ ބ‬pi,i−1 = 1, 2 ≤ i ≤ n. ۴ऌ
ႄ৘ 2, ච౷эߐ Cholesky ‫֥ࢳٳ‬ෘ‫م‬ॖ૭ඍӮೂ༯:

ෘ‫ م‬3.3.2
V 0 = V , W0 = W, A = V TV − WTW
for i = 0 to n − 1 do
     
V i+1 I 0 V i

i+1
= Q̂(i)
W 0 Q Wi
end { for }

ෘ‫م‬ᇏ Q̂(i) აႄ৘ 3.3.2 ᇏ Q̂ ֥‫ק‬ၬཌྷ๝, ᆃൈ֥ Q̂(i) ൞Ϝ Wi ֥ؓ࢘ཌഈ֥ჭ


෍ཨູ 0. ೂ‫ݔ‬इᆔ A ֥୉൞϶ջॺູ β ֥ջሑइᆔ, ᄵෘ‫ م‬3.3.2 ᇏ֥࿖ߌэਈ i ᆺ
ླ֞ β ࣼॖ࠹ෘԛ A ֥ Cholesky ‫ࢳٳ‬, Ֆ‫ࡨط‬ഒਔ࠹ෘൈࡗ, བྷ༥֥ษં౨ҕ࡮໓ང
[12]. ႮႿ࠹ෘૄ۱ Hk ൞ཌྷ޺‫׿‬৫֥, ၹՎၞႿѩྛ࠹ෘ, ᆃ৚ࣼ҂ᄜབྷඍਔ.

§3.3.3 ྩᆞ֥ච౷эߐ Cholesky ‫ࢳٳ‬


(k) ֥Ӱࠒ, ‫ૄط‬۱ Q
ᄝෘ‫ م‬3 ᇏ Q̂(i) ൞ Q (k) ᆺ႕ཙ V i ‫ ބ‬W i ֻ֥ k ྛ, ൌ࠽ഈ
ࣼ൞ච౷эߐቔႨ֞၂۱ 2 × l इᆔഈ, ࡌഡ M ൞ 2 × l इᆔ, H ൞ච౷эߐ. ໡ૌ֥ଢ
֥൞ᄝ࠹ෘ M = HM ൐֤ m̄21 = 0 ֥၂༢ਙ࠹ෘ‫ݖ‬ӱᇏࡨഒ࠹ෘਈ.
ູ൐ m̄21 = 0, H ൞ಸၞ࠹ෘ֥, ູՎॖၛ࿊ᄴ ρ = m21 m−1
11 . ֌൞ᆃླေषٚᄎ
ෘ‫ ބ‬6 × l Ցෘඌᄎෘ. ູղ֞҂षٚ‫ࡨބ‬ഒෘඌᄎෘ֥ଢ֥, ࡌഡ M = KB, ఃᇏ
K = diag(K1 , K2 ) ൞ 2 × 2 ᆞؓ࢘इᆔ, ࠧ K1 > 0 ‫ ބ‬K2 > 0. ਷ G = K̄ −1 HK, ఃᇏ
K̄ ൞ 2 × 2 ؓ࢘इᆔ. ೂ‫ ݔ‬B̄ = GB, ᄵ M̄ = K̄ B̄. ᆃ৚๙‫ݖ‬ൡ֒࿊౼ K̄, ၛղ֞ࡨഒ
ᄎෘՑඔ‫ބ‬षٚᄎෘ֥ଢ֥. ᄝᆃ৚໡ૌѩ҂ᆰࢤ࠹ෘ K̄, ‫ط‬൞Ⴈ෱֥௜ٚྙൔ. ࡌഡ
L = K 2 , L̄ = K̄ 2 , ᄵ L̄ ֥࠹ෘႮ༯૫֥ႄ৘۳ԛ.
§3.3 ؓӫᆞ‫ק‬ཌྟٚӱቆ֥ѩྛࢳ‫م‬ 45

ႄ৘ 3.3.3 ࡌഡ α = L2
L1
,β= b21
b11
. ೂ‫ݔ‬࿊౼ L̄ = (1 − αβ 2 )−1 L, ᄵ
 
1 −αβ
G=
−β 1

ᆣૼğՖ H ֥‫ק‬ၬ໡ૌᆩ֡ ρ = m21 m−1


11 =
K2 b21
K1 b11
. ၹՎࣼႵ
 K2b
  
− 12 K1 − K21 b11
21
− 1 1 −αβ
HK = (1 − ρ2 ) = (1 − αβ 2 ) 2
K
− K2 b21
b11
K2 −β 1

ႄ৘֤ᆣ.
ႄ৘ 3.3.4 ೂ‫ ݔ‬R ‫ ބ‬S ‫׻‬൞ n × n ഈ೘࢘इᆔ, ѩ౏ E ‫ ބ‬F ൞ؓ࢘इᆔ, ൐֤
RT ER − S T F S ൞ᆞ‫֥ק‬, ѩࡌഡ αk = Fk
Ek
, βk = skk
rkk
, ೂ‫ݔ‬
   
R R
= Q̂
S S

(n) Q
ఃᇏ Q̂ = Q (1) ,Q
(n−1) · · · Q (k) , E ‫ ބ‬F ֥ჭ෍൞ೂ༯‫ק‬ၬ֥:


⎪ 1, i=j


⎨ −α β , i = k, j = n + k
(k) k k
q̃ij =

⎪ −βk , i = n + k, j = k



0, ః෱

‫ބ‬
k = Ek Fk
E , Fk = , 1≤k≤n
1 − αk βk2 1 − αk βk2
ᄵR R
T E  ൞ഈ೘࢘इᆔ, S ൞࿸۬ഈ೘࢘इᆔ.
 − ST FS = RT ER − S T F S, ѩ౏ R

ᆃ۱ႄ৘֥ᆣૼ൞ಸၞ֥, ‫ܣ‬Վ੻ಀ.
ࡌഡ A = V T EV − W T F W , ᄵྩᆞ֥ච౷ Cholesky ‫ࢳٳ‬ෘ‫م‬ॖФ૭ඍӮೂ༯ྙൔ:

ෘ‫ م‬3.3.3
V 0 = V , W 0 = W , E 0 = E, F 0 = F
for i = 0 to n − 1 do
     
V i+1 I 0 V i
= Q̂(i)
W i+1 0 P Wi
Eki Fki
Eki+1 = i2
, Fki+1 = 2, 1≤k≤n
1 − αki βk 1 − αki βki
46 ֻ೘ᅣ इᆔѩྛ࠹ෘ

F1i+1 = Fni+1 , i+1


Fk+1 = Fki+1 , 1≤k ≤n−1
end { for }

ᆃ৚ Q̂(i) ֥‫ק‬ၬაႄ৘ 3.3.4 ᇏ Q̂ ֥‫ק‬ၬཌྷ๝. ᆃ۱ෘ‫م‬აෘ‫ م‬3.3.2 ၂ဢ‫׻‬൞ၞ


Ⴟѩྛൌགྷ֥.

§3.4 ೘ؓ࢘ٚӱቆ֥ѩྛࢳ‫م‬
ࢳ೘ؓ࢘ཌྟٚӱቆᄝொັ‫ٳ‬ٚӱඔᆴࢳᇏఏሢ٤ӈᇗေ֥ቔႨ, ၹՎၘࣜႵਔ‫ޓ‬
‫ܱ؟‬Ⴟ෱֥ѩྛෘ‫م‬, ᆃٚ૫֥‫۽‬ቔॖҕ࡮໓ང [13]–[14]. ᆃ৚ሢᇗࠎႿ౵თ‫ٳ֥ࢳٳ‬
ਚٚ‫م‬, ၛьູࣉ၂֥҄ѩྛ࠹ෘյ༯ࠎԤ. ᄝᆃ৚ေ౰ࢳ֥໙ี൞ Ax = d, ఃᇏ
⎡ ⎤
a0 b 0
⎢ ⎥
⎢ c 1 a1 b ⎥
⎢ 1 ⎥
⎢ ... ... ... ⎥
A = T (c, a, b) = ⎢ ⎥
⎢ ⎥
⎢ ⎥
⎣ c n−2 a n−2 b n−2 ⎦

cn−1 an−1

ؓႿ၂Ϯྟ֥೘ؓ࢘ཌྟսඔٚӱቆđѩྛ౰ࢳ֥ٚ‫ࣜၘ္م‬Ⴕྸ‫۽؟‬ቔbᆃ৚ᇗׄॉ
੮ؓӫᆞ‫ק‬೘ؓ࢘ཌྟٚӱቆ֥ࢳ‫م‬, ෱ࠎႿؓइᆔ֥‫ॶٳ‬, ‫ܣ‬Վӫᆭູ‫ٳ‬ਚ‫[ م‬16, 14] .
ః‫ྙࢳٳ‬ൔູೂ༯֥ॶ೘ؓ࢘इᆔ:
⎡ ⎤
A0 B0
⎢ T ⎥
⎢ B0 A1 B1 ⎥
⎢ ⎥
⎢ ... ... ... ⎥
A=⎢ ⎥
⎢ ⎥
⎢ T ⎥
⎣ Bp−3 Ap−2 Bp−2 ⎦
T
Bp−2 Ap−1

ఃᇏ Bi ᆺႵቐ༯֥࢘၂۱ჭ෍҂ູਬ,Ai ൞ؓӫᆞ‫ק‬೘ؓ࢘इᆔ. ၹՎॖၛؓ Ai ቓ


LDLT ‫ࢳٳ‬, ᆃ৚ D ൞ؓ࢘इᆔ,L ൞ֆ໊༯೘࢘ᆔ. ࡌഡ Ai = Li Di LTi , ਷ L =
diag(Li ), ᄵႵ ⎡ ⎤
D0 B̄0
⎢ T ⎥
⎢ B̄0 D1 B̄1 ⎥
⎢ ⎥
⎢ ... ... ... ⎥
L−1 AL−T =⎢ ⎥
⎢ ⎥
⎢ T ⎥
⎣ B̄p−3 Dp−2 B̄p−2 ⎦
T
B̄p−2 Dp−1
§3.5 ࣜ‫םׅ‬սෘ‫֥م‬ѩྛ߄ 47

ఃᇏ B̄i = L−1 −T −T
i Bi Li+1 = Bi Li+1 , ෱൞Ԣቋު၂ྛຓनູ 0 ֥इᆔ. ႮႿ Di ൞ؓ࢘इᆔ,
ॖၛ‫ٳ‬љϜ B̄i ֥ቋު၂ྛԢቋު၂۱ჭ෍ຓनཨູ 0, ࠺ཨಀު֥इᆔູ D i ‫ ބ‬B
i , Ֆ
‫ط‬D i ၛࠣ B
i ‫ ބ‬B  T ֥ቋު၂۱ჭ෍‫ܒ‬Ӯ၂۱ྍ֥ཬ֥೘ؓ࢘ཌྟٚӱቆ. ؓႿᆃ۱
i
ཬ֥ཌྟٚӱቆॖᄝ၂෻ࠏఖഈট౰ࢳ, Ϝᆃ۱ࢳԮෂ֞෮Ⴕ֥ԩ৘ࠏᇏ, ࣼॖ౰ԛჰ໙
ี֥ࢳ. ᄝᆃ۱ٚ‫م‬ᇏ, ൮༵ေႨ֥֞൞ LDLT ‫ࢳٳ‬, ᆃ۱‫ࢳٳ‬ॖႮোරႿഈ၂ࢫᇏ֥
RT R ‫֥ࢳٳ‬ٚ‫֤֞م‬, ᆃ৚ᆺླႨԱྛ֥‫ࢳٳ‬ٚ‫م‬, ‫ܣ‬҂ᄜऎุਙԛ LDLT ֥Աྛ‫ࢳٳ‬
ٚ‫م‬. ሸഈ෮ඍ, ໡ૌॖ۳ԛ༯ඍෘ‫م‬:

ෘ‫ م‬3.4.1
(1) ࠹ෘ Li , Di , ൐ Ai = Li Di LTi ;
(2) ؓइᆔቓэߐ, ѩؓ Bi ቓభඍ֥ཨಀ;
(3) ྙӮཬ֥೘ؓ࢘ཌྟٚӱቆ, ѩ౰ࢳᆭ;
(4) ౰ࢳᆜ۱໙ี.

ᆃ۱ෘ‫م‬ऎႵ‫֥ݺޓ‬ѩྛྟ, ൞ଢభФಪູ౰ࢳᆃো໙ีቋႵི֥ෘ‫م‬. ๙‫ࡥݖ‬ֆ


֥࠹ෘॖၛ֤ԛ, ‫ھ‬ෘ‫֥م‬ѩྛ࠹ෘ‫گ‬ᄖྟбԱྛ࠹ෘ‫گ‬ᄖྟᄹࡆਔ၂П, ෙಖᄹࡆਔѩ
ྛྟ, ֌࠹ෘ‫گ‬ᄖྟ֥ᄹࡆࢆ֮ਔෘ‫ੱི֥م‬. ଢభႮႿಌഒ۷Ⴕི֥೘ؓ࢘ٚӱቆ֥ѩ
ྛ࠹ෘٚ‫م‬, ‫ھ‬ෘ‫م‬ᄝ౰ࢳՎ໙ีൈಯФܼٗҐႨ. ႮႿ෱൞‫ॶٳ‬ᄝૄ۱ԩ৘ࠏഈ‫׿‬৫
ࣉྛնਈ֥ᄎෘ, ၹՎᆃ۱ෘ‫م‬҂଴ႋႨ֞ॶ೘ؓ࢘ཌྟٚӱቆ.

§3.5 ࣜ‫םׅ‬սෘ‫֥م‬ѩྛ߄
ඔᆴսඔٚӱቆ֥౰ࢳٚ‫م‬đႵᆰࢤ‫م‬đ္Ⴕ‫ם‬ս‫م‬bభ૫໡ૌࢺകਔ၂ུᆰࢤ౰ࢳ
ཌྟսඔٚӱቆ֥ٚ‫م‬đᆃ৚ࡼࡥֆࢺക၂༯ࣜ‫םׅ‬ս౰ࢳཌྟսඔٚӱቆ֥ٚ‫م‬bᄝ
༯૫ࢺക֥ٚ‫م‬ᇏđࡌഡइᆔ֥ؓ࢘ཌჭ෍‫׻‬൞٤ਬ֥b

§3.5.1 Jacobi ‫ם‬ս‫م‬

ॉ੮౰ࢳཌྟսඔٚӱቆ
Ax = b (3.9)

ఃᇏ A ൞ m × m इᆔđ࠺ Da−La−U ‫ٳ‬љ൞ A ֥ؓ࢘a࿸۬༯೘࢘a࿸۬ഈ೘࢘҆


‫ܒٳ‬Ӯ֥इᆔđࠧ A = D − L − Ubᆃൈٚӱቆ 3.9 ॖၛэູ

Dx = b + (L + U )x (3.10)

ೂ‫ݔ‬ٚӱቆ 3.10 Ⴗш֥ x ၘᆩđႮႿ D ൞ؓ࢘इᆔđॖၛ‫ޓ‬ಸၞ౰֤ቐш֥ xđᆃࣼ


48 ֻ೘ᅣ इᆔѩྛ࠹ෘ

൞ Jacobi ‫ם‬ս‫֥م‬ԛ‫ׄؿ‬bၹՎđؓႿ۳‫֥ק‬Ԛᆴ x(0)đJacobi ‫ם‬ս‫م‬ೂ༯ğ

x(k+1) = D−1 (L + U )x(k) + D−1 b (3.11)

࠺ G = D−1 (L + U ) = I − D−1 Ađg = D−1 bbᄵૄՑ‫ם‬սࣼ൞ቓइᆔཟਈӰđಖު൞ཟ


ਈࡆbၧࠧğ
x+ = Gx + g (3.12)

‫܄‬ൔ 3.12 ֥࠹ෘ‫ބ‬భ૫ᄝࢺക๝҄ѩྛ࠹ෘٚ‫֥م‬ൈީ൞োර֥đၹՎѩྛ࠹ෘٚ‫م‬൞


٤ӈಸၞ֤֥֞đᆃ৚ࣼ҂ᄜሕඍb

§3.5.2 Gauss-Seidel ‫ם‬ս‫م‬

Gauss-Seidel ‫ם‬ս‫م‬൞ᇯ۱‫ٳ‬ਈࣉྛ࠹ෘ֥၂ᇕٚ‫م‬đॉ੮ཌྟսඔٚӱቆ 3.9 ֥


‫ٳ‬ਈіൕ

n
aij xj = bi , i = 1, . . . , n (3.13)
j=1

ؓႿ۳‫֥ק‬Ԛᆴ x(0)đGauss-Seidel ‫ם‬ս‫م‬ೂ༯ğ


ෘ‫ م‬3.5.1 (Gauss-Seidel ‫ם‬սෘ‫)م‬
• k=0
(k+1) n (k)
• x1 = (b1 − j=2 a1j xj )/a11
(k+1) (k+1)  (k)
• x2 = (b2 − a21 x1 − nj=3 a2j xj )/a22
• ...
(k+1)  (k+1) (k)
• xn−1 = (bn−1 − n−2
j=1 an−1,j xj − an−1,n xn )/an−1,n−1
(k+1)  (k+1)
• xn = (bn − n−1
j=1 anj xj )/ann
• x(k+1) − x(k) 2 < x(k+1) − x(0) 2 Ĥk = k + 1
Ֆෘ‫ م‬3.5.1 ֥࠹ෘ‫ݖ‬ӱॖၛ‫ؿ‬གྷđૄ࠹ෘ၂۱ྍ֥‫ٳ‬ਈ‫ླ׻‬ေభ૫෮Ⴕྍ࠹ෘԛ
ট֥‫ٳ‬ਈ֥ࢲ‫ݔ‬đᆃ൞၂۱࿸֥۬Աྛ‫ݖ‬ӱbପહđೂ‫ޅ‬ഡ࠹၂۱ѩྛ࠹ෘ֥ٚ‫଻م‬Ĥ࠺
 (0)
si = nj=i+1 aij xj đi = 1, . . . , n − 1đsn = 0bѩྛ࠹ෘٚ‫م‬ೂ༯ğ
ෘ‫ م‬3.5.2 (ѩྛ Gauss-Seidel ‫ם‬սෘ‫)م‬
k=0
for i = 1, n do
(k+1)
xi = (bi − si )/aii , si = 0
for j = 1, n, j = i do
(k+1)
sj = sj + aji xi
end{for}
§3.6 ၳ҄ѩྛ‫ם‬ս‫م‬ 49

end{for}
x(k+1) − x(k) 2 < x(k+1) − x(0) 2 Ĥk = k + 1
ᄝෘ‫ م‬3.5.2 ᇏđૄՑѩྛ࠹ෘ sjđᆭުॖၛѩྛ࠹ෘࢩᆸ่ࡱ൞‫ڎ‬ડቀbᆃ۱ѩྛ࠹ෘ
ٚ‫م‬აԱྛෘ‫م‬ᄝ࠹ෘਈഈ൞Ⴕུҵљ֥b

§3.6 ၳ҄ѩྛ‫ם‬ս‫م‬
ၳ҄‫ם‬սෘ‫م‬ᄝѩྛ࠹ෘᇏఏሢᇗေ֥ቔႨ, ၹູՎোෘ‫م‬҂ླေԩ৘ࠏᆭࡗ֥֩
ր, ൐ԩ৘ࠏ֥‫۽‬ቔིੱି‫֤֞ܔ‬ԉ‫ߨؿ֥ٳ‬. ᆃٚ૫֥࿹࣮‫۽‬ቔᄪᄝ 60 ୍սࣼၘࣜष
൓, ໓ང [17] ᇏ۳ԛਔཌྟ‫ם‬ս x = Bx + c ֥൬৻‫ק‬৘, ֒௶϶ࣥ ρ(|B|) < 1 ൈ, Վ‫ם‬
ս‫ݖ‬ӱ൞ၳ҄‫ם‬ս൬৻֥. ࠿Վᆭު, ໓ང [18] ۳ԛਔ٤ཌྟ‫ם‬ս x = F x ֥൬৻‫ק‬৘,
֒ F ൞ P - ൬෪႘ഝൈ, Վ‫ם‬ս‫ݖ‬ӱ൞ၳ҄‫ם‬ս൬৻֥. P - ൬෪႘ഝ (P-contraction) ֥
‫ק‬ၬҕ࡮໓ང [19].

§3.6.1 ၳ҄ѩྛ‫ם‬ս‫ࠎم‬Ԥ

൮༵ႄೆܱႿ x = F x ֥ၳ҄‫ם‬սෘ‫ק֥م‬ၬ, ቋު۳ԛ໓ང [18] ᇏ֥၂۱ࢲં. ࠺


|A| ູ A ֥ૄ۱ჭ෍౼धؓᆴ֥इᆔ, |x| іൕؓཟਈ x ֥‫ٳ‬ਈ౼धؓᆴ֥ཟਈ, A ≥ 0
іൕ A ֥ჭ෍नնႿ֩Ⴟ 0. F x ֻ֥ i ۱‫ٳ‬ਈ࠺ູ fi (x) ࠇ fi (x1 , . . . , xn ), ཟਈ྽ਙ࠺
ູ x(j) , j = 0, 1, . . ., ෮Ⴕ٤‫ڵ‬ᆜඔ֥ࠢ‫ ູ࠺ކ‬N .
‫ק‬ၬ 3.6.1 ഡ F ൞ Rn → Rn ֥႘ഝ, ᄵܱႿෘሰ F ‫ބ‬Ԛ൓ׄ x(0) ֥ၳ҄‫ם‬ս൞Ⴎ༯
ඍ‫־‬๷ܱ༢‫ק‬ၬ֥ཟਈ྽ਙ x(j) ∈ Rn , j = 1, 2, . . .,

J = {Jj |j = 1, 2, . . .}
(j) (j)
S = {(s1 , . . . , sn ) | j = 1, 2, . . .}



⎨ x(j−1)
i ,i ∈/ Jj
(j)
xi =

⎪ (j) (j)
⎩ fi (x(s 1
1 ) (s )
, . . . , xn n ), i ∈ Jj

ఃᇏ, J ൞ {1, 2, . . . , n} ֥٤ॢሰࠢ‫ܒ‬Ӯ֥྽ਙ, S ൞ N n ᇏ֥၂۱྽ਙ. Վຓ, ؓૄ۱


i = 1, . . . , n, J ‫ ބ‬S ડቀೂ༯೘۱่ࡱ:
(j)
(1) si ≤ j − 1, j = 1, 2, . . .;
(j)
(2) si ቔູ j ֥‫ݦ‬ඔ౴Ⴟ໭౫ն;
(3) i ᄝࠢ‫ ކ‬Jj (j = 1, 2, . . .) ᇏԛགྷ໭౫‫؟‬Ց.
༯шေႨ֞໓ང [18] ᇏ֥၂۱ᇗေࢲ‫ݔ‬, ‫ܣ‬Վ໡ૌၛႄ৘֥ྙൔ۳ԛ.
50 ֻ೘ᅣ इᆔѩྛ࠹ෘ

ႄ৘ 3.6.1 ࡌഡ |F x − F y| ≤ A|x − y|, ఃᇏ A ൞٤‫ڵ‬इᆔѩ౏ ρ(A) < 1. ᄵ‫ם‬ս


x = F x ൞ၳ҄൬৻֥.

§3.6.2 ཌྟ‫ם‬ս֥၂Ϯ൬৻ྟࢲ‫ݔ‬

ᄝᆃ၂ཬࢫᇏ, ॉ੮౰ࢳཌྟٚӱቆ Ax = b ֥၂ུ‫ם‬ս‫֥م‬൬৻ྟ. ؓႿཌྟ‫ם‬ս


‫م‬, ๙ӈҐႨ A ֥‫ٳ‬ਚྙൔ, A = B − C, ᆃൈ֥‫ם‬սྙൔೂ༯:

x = B −1 Cx + B −1 b (3.14)

ఃᇏ B ൞ॖ୉֥. Ⴎႄ৘ 3.6.1 ॖᆩ, ֒ ρ(|B −1 C|) < 1 ൈ, ഈඍ֥‫ם‬ս‫ݖ‬ӱ൞ၳ҄‫ם‬ս


൬৻֥. ༯૫໡ૌࣼؓ A ൞ M इᆔࠇؓ࢘ᅝႪइᆔ֥౦ঃษંః൬৻ྟ, ᆃུࢲ‫ݔ‬ಸ
ၞ๷ܼ֞‫ ॶٳ‬M इᆔࠇ H इᆔ, ܱႿᆃུइᆔ֥‫ק‬ၬॖҕ࡮໓ང [19]. ༯૫҂ࡆᆣૼ
ֹ۳ԛ໓ང [19] ᇏ֥၂ུࢲં. ൮༵۳ԛ೐ᆞᄵ‫ٳ‬ਚ֥‫ק‬ၬ.
‫ק‬ၬ 3.6.2 ഡ A, B ‫ ބ‬C ൞ൌइᆔ, ೂ‫ ݔ‬A = B − C, B −1 ≥ 0 ‫ ބ‬B −1 C ≥ 0, ᄵӫ
A = B − C ൞ A ֥೐ᆞᄵ‫ٳ‬ਚ.

ႄ৘ 3.6.2 ഡ A = B − C ൞၂೐ᆞᄵ‫ٳ‬ਚ, ᄵ ρ(B −1 C) < 1 ֒౏ࣇ֒ A−1 թᄝѩ౏


A−1 ≥ 0.

ႄ৘ 3.6.3 ഡ B ‫ ބ‬C ൞ n × n ࢨइᆔ, ೂ‫| ݔ‬C| ≤ B, ᄵ ρ(C) ≤ ρ(B).

ႄ৘ 3.6.4 ഡ A ൞࿸۬ࠇ҂ॖჿؓ࢘ᅝႪइᆔ, ೂ‫ ݔ‬aij ≤ 0 (i = j), ౏ aii > 0, ᄵ A


൞ M इᆔ.
༯૫໡ૌ҂ࡆᆣૼֹႄႨ໓ང [20] ᇏ֥ਆ۱ࢲં.
‫ק‬৘ 3.6.1 ഡ A = B − C ൞ A ֥೐ᆞᄵ‫ٳ‬ਚ౏ A ൞ M इᆔ, ᄵ‫ם‬սྙൔ (3.14) ൞
ၳ҄‫ם‬ս൬৻֥.
ᆃ۱‫ק‬৘ॖႋႨ֞ྸ‫ם؟‬ս‫م‬ᇏ, бೂ Jacobi ‫ ބ‬Gauss-Seidel ྘‫ם‬ս‫֩م‬. ؓႿᆃ
ᇕো྘֥‫ם‬ս‫م‬, ఃइᆔ A ‫ࢳٳ‬Ӯ A = D − L − U , ఃᇏ D ൞ؓ࢘इᆔ,L ‫ ބ‬U ‫ٳ‬љ൞
࿸۬༯‫ބ‬ഈ೘࢘इᆔ. ࠎႿᆃᇕ‫ٳ‬ਚྙൔ֥‫ם‬ս‫ݖ‬ӱ֥ၳ҄‫ם‬ս൬৻ྟॖႨ༯૫֥‫ק‬৘
۳ԛ.

‫ק‬৘ 3.6.2 ഡ A ൞࿸۬ࠇ҂ॖჿؓ࢘ᅝႪइᆔ,A = B − C, ఃᇏ B = D − αL, C =


(1 − α)L + U , 0 ≤ α ≤ 1, ᄵ‫ם‬սྙൔ (3.14) ൞ၳ҄‫ם‬ս൬৻֥.
ᆃུࢲ‫ݔ‬ᄝ౰ࢳொັ‫ٳ‬ٚӱ֥ҵ‫ٳ‬৖೛֥ٚӱᇏႵ‫ޓ‬ն֥ቔႨ, ၹູᄝҐႨ౵თ‫ٳ‬
ࢳ‫֥م‬ൈީ, ྐ༏֥ࢌߐॖၛ҂ླေ֩ր, ෮ၛᄝଖུ౦ঃ༯đॖၛิۚѩྛԩ৘ࠏི֥
ੱ.
§3.7 սඔหᆘᆴ໙ี֥ѩྛ౰ࢳ 51

§3.7 սඔหᆘᆴ໙ี֥ѩྛ౰ࢳ
սඔหᆘᆴ໙ีᄝ॓࿐ა‫۽‬ӱ࠹ෘᇏ൞٤ӈᇗေ֥đᄝᆃ၂ࢫᇏđ໡ૌࡼᇗׄࢺക
ೂ‫ޅ‬౰ࢳѓሙหᆘᆴ໙ีbࡌഡ A ൞ n × n ࢨൌؓӫइᆔđࠧ A ∈ Rn bᄵѓሙหᆘᆴ
໙ี൞ğ
Ax = λx (3.15)

ӫડቀหᆘٚӱ 3.15 ֥၂ؓ (λ, x) ູइᆔ A ֥หᆘؓđఃᇏ λ ӫູइᆔ A ֥หᆘᆴđx


ӫູइᆔ A ֥หᆘཟਈb

§3.7.1 ؓӫ೘ؓ࢘इᆔหᆘᆴ໙ี

ᄝหᆘᆴ໙ี 3.15 ᇏđॉ੮ A ൞ؓӫ೘ؓ࢘इᆔ֥หᆘᆴ໙ีđࠧğ


⎛ ⎞
a1 b1
⎜ ⎟
⎜ b 1 a2 b 2 ⎟
⎜ ⎟
⎜ ⎟
⎜ b2 a3 b3 ⎟
⎜ ⎟ x = λx (3.16)
⎜ ... ... ... ⎟
⎜ ⎟
⎜ ⎟
⎜ b a b ⎟
⎝ n−2 n−1 n−1 ⎠
bn−1 an

ႮႿइᆔหᆘᆴ൞หᆘٚӱ Pn (λ) = det(A − λI) ֥۴đၹՎđॖၛ๙‫࠹ݖ‬ෘ Pn (λ) ֥۴


ট౰หᆘٚӱ 3.16 ֥หᆘᆴb࠺ Ai ൞इᆔ A ֥ቐഈ࢘ i ࢨᇶሰൔđᄵႵೂ༯֥ࢌհ‫ק‬
৘b
‫ק‬৘ 3.7.1 ഡ෮Ⴕ֥ bj = 0đj = 1, . . . , n−1b࠺ Ai ֥หᆘᆴູ α1 < α2 < . . . < αiđAi+1
֥หᆘᆴູ β1 < β2 < . . . < βi < βi+1đᄵ Ai ֥หᆘᆴ‫ ۯٳ‬Ai+1 ֥หᆘᆴđࠧႵ
β1 < α1 < β2 < α2 < . . . < βi < αi < βi+1 b
ႮႿइᆔ A ൞ؓӫ೘֥ؓ࢘đၹՎ෱֥หᆘ‫؟‬ཛൔ൞ಸၞ࠹ෘ֥đऎႵೂ༯֥‫־‬๷
ྙൔğ ⎧

⎪P (λ) = 1

⎨ 0
P1 (λ) = a1 − λ (3.17)



⎩P (λ) = (a − λ)P (λ) − b2 P (λ) n = 2, . . .
n n n−1 n−1 n−2

Ֆඔᆴ࠹ෘ֥໗‫ࠣྟק‬ٚьॉ੮đ਷ Qn (λ) = Pn (λ)/Pn−1 (λ)đᄵႵğ



⎨Q1 (λ) = a1 − λ
(3.18)
⎩Q (λ) = (a − λ) − b2 /Q (λ) n = 2, . . .
n n n−1 n−1
52 ֻ೘ᅣ इᆔѩྛ࠹ෘ

इᆔ A ֥aཬႿ α ֥หᆘᆴ֥۱ඔ‫ܱބ‬༢ൔ 3.18 ᇏ Qi (α) ཬႿ 0 ֥۱ඔཌྷ๝đၹ


Վॖၛ๙‫࠹ݖ‬ෘ Qi (a) ‫ ބ‬Qi (b) ট౰၂۱۳‫ק‬౵ࡗ [a, b) ଽ֥หᆘᆴ۱ඔb
ࡌഡइᆔ A ֥෮Ⴕหᆘᆴᄝ౵ࡗ [α0 , αn ) ଽđ౼ α = (α0 + αn )/2đ࠹ෘ Qi (α)
ཬႿ 0 ֥۱ඔđ࠺ᆃ۱ඔູ kđ਷ αk = αđᄵॖၛ֤֞ྍ֥ਆ۱ཬ౵ࡗ [α0 , αk ) ‫ބ‬
[αk , αn )bಖުؓૄ۱ཬ౵ࡗࣉྛ๝ဢ֥ؓ‫ٳ‬đᆰ֞ૄ۱౵ࡗᇏ‫׻‬ᆺЇ‫ݣ‬၂۱หᆘᆴbࡌ
ഡ౵ࡗ [a, b) ଽᆺЇ‫ݣ‬इᆔ A ֥ 1 ۱หᆘᆴ λđᄵႵೂ༯֥࠹ෘ‫ھ‬หᆘᆴ֥࠹ෘٚ‫م‬ğ
ෘ‫ م‬3.7.1 (‫)مٳؽ‬
c = (a + b)/2, if |b − a| < , then stop
compute Qi (c) for all i
if λ < c, then b = c, otherwise a = c
ؓႿ۳‫֥ק‬หᆘᆴ λđఃหᆘཟਈॖၛ๙‫ݖ‬୉‫ם‬սটࠆ֤đ‫ם‬սྙൔೂ༯ğ

(A − λI)xk+1 = xk (3.19)

ؓ಩ၩ۳‫֥ק‬໭౫ٓඔ‫֥ཬޓ‬Ԛ൓ᆴ x0đࠧ x0 inf ԉ‫ཬ֥ٳ‬b၂Ϯ౦ঃ༯đ‫ם‬ս 1 ᇀ 2


Ցࣼॖၛ֤֞෮ླေ֥หᆘཟਈbᆴ֤ᇿၩ֥൞đٚӱ 3.19 ൞అၳ֥đᄝࣉྛ౰ࢳ֥ൈ
ީđླေ࿊ᇶჭđቋު၂۱ᇶჭॖି൞ 0đᆃൈީႨ  টսูbႮՎ࠹ෘหᆘᆴ‫ބ‬หᆘཟ
ਈ֥ٚ‫م‬đ൞၂۱ॖၛປಆѩྛ֥࠹ෘٚ‫م‬b

§3.7.2 Householder эߐ

Householder эߐ൞၂۱ห൹֥ᆞࢌэߐđ෱ऎႵೂ༯֥ྙൔğ

H = I − 2uuT (3.20)

ఃᇏ u2 = 1bಸၞဒᆣइᆔ H ൞၂۱ᆞࢌइᆔđᆃ۱इᆔႵ൉હ‫ݺ‬ԩ଻ĤՖ H ֥


іղൔ 3.20 ॖၛुԛđఃྙൔ٤ӈࡥֆđ൞၂۱ಸၞ‫ܒ‬ᄯ֥ᆞࢌइᆔb࠺ ei ൞ֆ໊इ
ᆔ I ֻ֥ i ਙđᄵؓႿ಩‫ޅ‬၂۱۳‫֥ק‬ཟਈ xđॖၛ࿊ᄴ၂۱ Householder эߐđ൐֤
Hx = αe1 b༯૫໡ૌࢺകೂ‫࠹ޅ‬ෘᆃ۱ Householder эߐđࡌഡ u ൞၂۱಩ၩ֥ཟਈđ
ᄵ H = I − 2uuT /u22 ൞၂۱ Householder эߐbູ൐ Hx = x − 2(uT x/u22 )u = αe1đ
෮ၛ |α| = x2 bՖཌྟսඔ֥ࠎԤᆩ്ॖᆩđu ၂‫ק‬൞ x ‫ ބ‬e1 ֥ཌྟቆ‫ކ‬bၹՎđॖ
ၛࡌഡ u = x + βe1đႮՎॖ֤ğ
β 2 − x22 2(x22 + βx1 )
x − βe1 = αe1 (3.21)
x22 + 2βx1 + β 2 x22 + 2βx1 + β 2
ູ൐֩ൔ 3.21 ؓ಩ၩ֥ x Ӯ৫đᄵсႵ β 2 − x22 = 0bᄝ࠹ෘ‫ݖ‬ӱᇏđູЌᆣඔᆴ໗
‫ྟק‬đ౼ β = sign(x1 )x2 bႮՎॖၛ֤ԛđα = −βb
Householder эߐᄝඔᆴ࠹ෘᇏ൞٤ӈᇗေ֥đྸ‫ބ؟‬ᆞࢌइᆔ‫ࢳٳ‬Ⴕܱ֥໙ี‫׻‬৖
҂षᆃ۱эߐbбೂइᆔ QR ‫ࢳٳ‬a߄ؓӫइᆔູ೘ؓ࢘इᆔ֩b
§3.8 ቔြ 53

§3.7.3 ߄ؓӫइᆔູ೘ؓ࢘इᆔ

ᄝᆃ၂ࢫᇏđॉ੮ೂ‫ؓࡼޅ‬ӫइᆔ߄ູ೘ؓ࢘इᆔb࠺
 
α uT
A= (3.22)
u B
 
1 0
Ⴎభඍ֥ษંॖᆩđթᄝ၂۱ Householder эߐ Hđ൐֤ Hu = βe1 b਷ G = đ
0 H
ᄵइᆔ G ္൞ᆞࢌइᆔb౏Ⴕğ
 T     
1 0 α uT 1 0 α βeT1
GT AG = = (3.23)
0 H u B 0 H βe1 H T BH

๝ဢ໡ૌॖၛؓइᆔ H T BH ቓ‫ބ‬ൔ 3.23 ཌྷ๝֥ҠቔđႮՎॖၛ֤ԛ෮ླ֥೘ؓ࢘इ


ᆔbᄝѩྛ࠹ෘᇏđHouseholder эߐ൞࠹ෘ၂۱ཟਈđᄝ၂۱ԩ৘ࠏᇏࣉྛđѩྛᇶ
ေุགྷᄝૄՑ࠹ෘ H T BHb༯૫ॉ੮ೂ‫࠹ޅ‬ෘ H T BHđࡌഡ Householder эߐ H =
I − 2vv T /(v T v)đᄵႵğ

H T BH = (I − 2vv T /(v T v))B(I − 2vv T /(v T v))


(3.24)
= B − 2vv T B/(v T v) − 2Bvv T /(v T v) + 4(v T Bv)vv T /(v T v)2

vT x
਷ τ = 2/(v T v)đx = Bvđw = 2
v − τ xđᄵğ

H T BH = B − vwT − wv T (3.25)

ࣜ‫ݖ‬эྙ֥ྩᆞ‫܄‬ൔ 3.25 бᆰࢤ࠹ෘٚ‫ م‬3.24 ࢫჿਔ၂۱ؓӫᇇ 1 ྩᆞbᄝᆃ৚đѩ


ྛ࠹ෘᇶေЇওਆ۱҆‫ٳ‬đ၂൞࠹ෘ x = Bvđਸ਼၂۱൞࠹ෘ‫܄‬ൔ 3.25bႮՎॖ࡮ѩྛ࠹
ෘ‫ݖ‬ӱ൞бࢠಸၞ֥đࣼ҂ᄜሕඍb

§3.8 ቔြ
1. ࡌഡइᆔ B ൞οਙज৺ٚൔթ٢ᄝ q ۱ԩ৘ࠏᇏđཟਈ u ‫ ބ‬v թ٢ᄝૄ۱ԩ৘ࠏ
ᇏđ۳ԛѩྛ࠹ෘ A = B − uv T − vuT ֥ٚ‫م‬b
2. ࡌഡइᆔ A ൞೘֥ؓ࢘đ൫۳ԛ౰ࢳٚӱቆ Ax = b ֥ѩྛ Jacobi ‫ם‬սٚ‫م‬b
54 ֻ೘ᅣ इᆔѩྛ࠹ෘ
ֻ೘҆‫ٳ‬

ѩྛൌགྷ
ֻඹᅣ ѩྛӱ྽ഡ࠹

ѩྛӱ྽ഡ࠹൞ѩྛೈࡱष‫ࠎ֥ؿ‬Ԥᆭ၂đᆌؓ҂๝֥ѩྛ࠹ෘࠏđၛࠣ҂๝֥ѩ
ྛൌགྷ௜෻đఃൌགྷٚൔ൞҂๝֥bᄝᆃ၂҆‫ٳ‬đࡥֆࢺകѩྛൌགྷ‫ݖ‬ӱ෮ླ֥ࠎЧ࠯
ඌb

§4.1 ѩྛщӱଆൔ֥ᇶေো྘
ѩྛщӱଆൔᇶေႵೂ༯֥೘ᇕো྘ğ
• ᇶՖଆൔ (Master-slave)ğႵ၂۱ᇶࣉӱđః෱ູՖࣉӱbᄝᆃᇕଆൔᇏđᇶࣉӱ၂
Ϯ‫ڵ‬ᄳᆜ۱ѩྛӱ྽֥ඔऌ॥ᇅđՖࣉӱ‫ڵ‬ᄳؓඔऌ֥ԩ৘‫࠹ބ‬ෘ಩ༀđ֒ಖđᇶࣉ
ӱ္ॖၛҕაؓඔऌ֥ԩ৘‫࠹ބ‬ෘb၂Ϯ౦ঃ༯đՖࣉӱᆭࡗ҂‫ؿ‬ളඔऌࢌߐđඔऌ
֥ࢌߐ‫ݖ‬ӱ൞๙‫ݖ‬ᇶࣉӱটປӮ֥b
• ؓӫଆൔ (SPMD)ğᄝᆃᇕщӱଆൔᇏđીႵଧ۱ࣉӱ൞ᇶࣉӱđૄ۱ࣉӱֹ໊֥൞
ཌྷ๝֥bಖ‫ط‬đᄝѩྛൌགྷ‫ݖ‬ӱᇏđ໡ૌሹ൞ေᄝᆃུࣉӱᇏ࿊ᄴ၂۱ࣉྛൻೆൻԛ
֥ࣉӱđ෱ϲဆ֥࢘೤‫ބ‬ᇶࣉӱোරb
• ‫؟‬ӱ྽ଆൔ (MPMD)ğᄝૄ۱ԩ৘ࠏഈᆳྛ֥ӱ྽ॖି൞҂๝֥đᄝଖུԩ৘ࠏഈ
ॖିᆳྛཌྷ๝֥ӱ྽b

§4.2 ѩྛӱ྽֥ࠎЧหׄ
ѩྛӱ྽‫ބ‬Աྛӱ྽ીႵ‫ޓ‬ն֥ҵљđ൞ູਔൌགྷѩྛෘ‫م‬ᄝѩྛ࠹ෘࠏഈ֥ᆳྛb
ᇶေЇও೘۱҆‫ٳ‬ğ
• ࣉೆѩྛߌ࣢ğᆃ҆‫ٳ‬൞ေಞ༢๤ᆩ֡Վӱ྽൞ѩྛӱ྽đఓ‫׮‬ѩྛ࠹ෘߌ࣢bᄝᆃ
۱‫ݖ‬ӱᇏđӁളѩྛӱ྽෮ླေ֥۲ᇕߌ࣢эਈb
• ᇶุѩྛ಩ༀğᆃ൞ѩྛӱ྽֥ൌᇉ҆‫ٳ‬đ෮ႵླေѩྛটປӮ֥಩ༀ‫׻‬ᄝᆃ৚ࣉ
ྛbᄝᆃ۱҆‫ٳ‬ᇏđൌགྷѩྛෘ‫م‬ᄝѩྛ࠹ෘࠏഈ֥ᆳྛ‫ݖ‬ӱb
• ๼ԛѩྛߌ࣢ğ๙ᆩѩྛ࠹ෘ༢๤đՖᆃ৚ष൓đ҂ᄜ൐Ⴈѩྛ࠹ෘߌ࣢b၂Ϯটඪđ
ᆺေ๼ԛѩྛ࠹ෘߌ࣢đၩ໅ሢࡼࢲඏӱ྽֥ᄎྛb

§4.3 ѩྛӱ྽֥ൌགྷ࠯ඌ
ѩྛӱ྽ᄝൌགྷ‫ݖ‬ӱᇏđႵఃหႵ֥࠯ඌđ൞Ӂളིۚੱѩྛӱ྽֥ࠎԤbᆃ৚ၛଢ
భੀྛ֥ѩྛӱ྽ଆൔ SPMD ູ২đࡥֆࢺകᆃোӱ྽ᄝൌགྷ‫ݖ‬ӱᇏླေᅧ໤֥ࠎЧ࠯

57
58 ֻඹᅣ ѩྛӱ྽ഡ࠹

ඌb
• ࣉӱ॥ᇅğᄝ SPMD ѩྛӱ྽֥щཿ‫ݖ‬ӱᇏđၹູᆺႵ၂‫ٺ‬ӱ྽đૄ۱ԩ৘ࠏഈᆳ
ྛ֥൞ཌྷ๝֥ӱ྽bၹՎđؓႿૄ۱ࣉӱটඪđླေᆩ֡ሱ࠭൞උႿଧ۱ࣉӱđՖ‫ط‬
টಒ‫ࣉھק‬ӱླေປӮ֥಩ༀbࣉӱ॥ᇅ൞ѩྛӱ྽֥ᇗေቆӮ҆‫ٳ‬đ෮Ⴕ֥ඔऌԩ
৘‫ݖߐࢌބ‬ӱ‫׻‬৖҂षࣉӱѓ്đ൞ᄝൌགྷ‫ݖ‬ӱᇏсྶൈख़ေহ࠺֥b
• ඔऌࢌߐğᄝ SPMD ଆൔᇏđඔऌࢌߐ൞ఃᇶေหᆘbࣉӱᆭࡗ֥ླྀ๝‫۽‬ቔđྐ༏
܎๙֩‫׻‬৖҂षඔऌࢌߐbೂ‫ކޅ‬৘ֹൌགྷඔऌࢌߐđ൞ิۚѩྛ࠹ෘӱ྽ྟି֥ܱ
࡯ᆭ၂bؓႿ၂۱۳‫֥ק‬ѩྛ࠹ෘٚ‫م‬đູਔིۚੱ֥ൌགྷđླေር༥‫ٳ‬༅ඔऌ၇ঠ
ܱ༢đ࣐ॖିࡨഒ҂сေ֥ඔऌࢌߐđ๝ൈ္ေ࣐ቋն୭৯൐ඔऌࢌߐᄝቋഒ֥Ցඔ
ଽປӮb
• ૫ཟؓའ߄ğࡹ৫ሱ֥࠭๙࿟९đ൐ӱ྽ऎႵ۷ࡆᆰܴ֥ॖ‫ྟ؀‬bбೂඪđᄝԩ৘ࠏ
ᇏေࣉྛइᆔԮൻđପࣼླေ‫ק‬ᇅ၂۱ሰӱ྽টປӮᆃཛ಩ༀb
ֻ໴ᅣ ཨ༏Ԯ‫־‬щӱࢤ१ MPI

§5.1 MPI ࡥࢺ

MPI ൞ႇ໓ Message Passing Interface ֥෪ཿ, ൞ࠎႿཨ༏Ԯ‫־‬щཿѩྛӱ྽֥၂


ᇕႨ޼ࢸ૫. ཨ༏Ԯ‫־‬൞ଢభѩྛ࠹ෘࠏഈܼٗ൐Ⴈ֥၂ᇕӱ྽ഡ࠹ଆൔ, หљ൞ؓ‫҃ٳ‬
ൔթԥ֥ॖঔᅚ֥ѩྛ࠹ෘࠏ SPCs (Scalable Parallel Computers) ‫۽ބ‬ቔᅟࠏಕ NOWs
(Networks of Workstations) ࠇ COWs (Clusters of Workstations). ࣐ܵߎႵ‫؟ޓ‬ః෱֥
ӱ྽ൌགྷٚൔ, ֌൞‫ݖ‬ӱᆭࡗ֥๙ྐҐႨཨ༏Ԯ‫ࣜၘ־‬൞၂ᇕ‫്܋‬. ᄝ MPI ‫ ބ‬PVM ໙
ൗၛభ, ѩྛӱ྽ഡ࠹აѩྛ࠹ෘࠏ༢๤൞ૡ్ཌྷܱ֥, ؓ҂๝֥ѩྛ࠹ෘࠏࣼေщཿ҂
๝֥ѩྛӱ྽, ۳ѩྛӱ྽ഡ࠹‫ބ‬ႋႨջটਔྸ‫؟‬ઐِ, ܼնѩྛ࠹ෘࠏ֥Ⴈ޼௧్ླေ
၂ུ๙Ⴈ֥ཨ༏Ԯ‫־‬Ⴈ޼ࢸ૫, ൐ѩྛӱ྽ऎႵ‫ބ‬Աྛӱ྽၂ဢ֥ॖ၍ᆱྟ.
ᄝ‫ݖ‬ಀ֥ 4 ୍ᇏ, ‫࠽ݓ‬ഈಒ‫ק‬ਔ MPI ູཨ༏Ԯ‫־‬Ⴈ޼ࢸ૫ѓሙ, ሱՖ 1994 ୍ 6 ᄅ
๷ԛ MPI ၛট, ෱ၘФܼٗࢤ൳‫ބ‬൐Ⴈ, ଢభ‫࠽ݓ‬ഈ๷ԛ֥෮Ⴕѩྛ࠹ෘࠏ‫׻‬ᆦӻ MPI
‫ ބ‬PVM. ؓႿ൐Ⴈ SPCs ֥Ⴈ޼টඪ, щཿ SPMD ѩྛӱ྽൐Ⴈ MPI ॖି۷ູٚь.
ᄝ൐Ⴈ MPI ‫ݦ‬ඔაӈඔൈေᇿၩ, MPI ֥෮Ⴕ‫ݦ‬ඔაӈඔनၛ MPI_ ष๨. ᄝ C ӱ྽
ᇏ, ෮Ⴕӈඔ֥‫ק‬ၬԢ༯߃ཌຓ၂ੰႮնཿሳଛቆӮ, ᄝ‫ݦ‬ඔ‫ބ‬ඔऌো྘‫ק‬ၬᇏ, ࢤ MPI_
ᆭުֻ֥၂۱ሳଛնཿ, ఃჅಆູ҆ཬཿሳଛ, ᄝ෮Ⴕ‫ݦ‬ඔ‫ט‬Ⴈᆭު‫ْ߭ࡼ׻‬၂۱հ༂
ྐ༏઒, ؓႿ Fortran ӱ྽, MPI ‫ݦ‬ඔಆ҆ၛ‫ݖ‬ӱٚൔ‫ט‬Ⴈ, ఃհ༂઒ၛ࿯ჭҕඔْ߭.
Վຓ, MPI ൞οࣉӱቆ (Process Group) ٚൔ‫۽‬ቔ֥, ෮Ⴕ MPI ӱ྽ᄝष൓ൈनФಪູ
൞ᄝ๙ྐሰ MPI_COMM_WORLD ෮ႚႵ֥ࣉӱቆᇏ‫۽‬ቔ, ᆭުႨ޼ॖၛ۴ऌሱ֥࠭ླေ, ࡹ
৫ః෱֥ࣉӱቆ. Վຓߎླᇿၩ֥൞, ෮Ⴕ MPI ֥๙ྐ၂‫ק‬ေᄝ๙ྐሰ (communicator)
ᇏࣉྛ. Վԩ໡ૌ࿊ᄴਔ൐Ⴈ MPI щӱᇏӈႨ֥‫ݦ‬ඔቔࢺക, ѩࢲ‫ކ‬ѩྛ࠹ෘ֥ൌ࠽ླ
ေ, ۳ԛਔնਈ֥ Fortran ӱ྽ൕ২, ၛьᄹ఼ؓ MPI ‫ݦ‬ඔ֥৘ࢳ, ܱႿ MPI ֥བྷ༥ࢺ
കॖҕ࡮໓ང [5].

§5.2 MPI ӱ྽ൌ২

ᄝᆃ၂ࢫᇏđ۳ԛ၂۱࠹ෘ π ֥ѩྛӱ྽bՖັࠒ‫֥ٳ‬ᆩ്ॖᆩ
 1
4
π= 2
dx (5.1)
0 1+x

59
60 ֻ໴ᅣ ཨ༏Ԯ‫־‬щӱࢤ१ MPI

ᆃ৚໡ૌҐႨะྙ࠹ෘ‫܄‬ൔđ౰ 5.1 ֥ඔᆴࠒ‫ٳ‬bࡌഡࡼ౵ࡗ‫ٳ‬Ӯ n ֩‫ٺ‬đh = 1/nđ࠺


xi = ihđi = 0, 1, . . . , nđࠧႵğ
 1 h n−1
4 4 4 h3 4
2
dx = [ ( 2
+ 2
) − ( 2
) ] (5.2)
0 1+x i=0
2 1 + x i 1 + x i+1 12 1 + ξi


ؓႿ۳‫֥ࣚק‬؇ đॖၛಒ‫ ק‬N =  4/3bࠧ֒ n ≥ N ൈđႵğ
 1 h
n−1
4 4 4
| dx − [ ( 2
+ )]| <  (5.3)
0 1+x 2
i=0
2 1 + xi 1 + x2i+1

২ 5.2.1 ѩྛ࠹ෘ π ᆴ
program computing_pi
include ’mpif.h’

integer iam, np, comm, ierr


integer n, i, num, is, ie
real*8 pi, h, eps, xi, s

call mpi_init(ierr)
call mpi_comm_dup(mpi_comm_world, comm, ierr)
call mpi_comm_rank(comm, iam, ierr)
call mpi_comm_size(comm, np, ierr)
print *, ’Process ’, iam, ’ of ’, np, ’ is running!’

if(iam .eq. 0) then


write(*, *) ’Number of digits(1-16)= ’
read(*, *) num
endif

call mpi_bcast(num, 1, mpi_integer, 0, comm, ierr)


eps = 1
do 10 i=1, num
eps = eps * 0.1
10 continue

n = sqrt(4.0/(3.0*eps))
h = 1.0/n
num = n/np
if(iam .eq. 0) then
s = 2.0
xi = 0
is = 0
§5.2 MPI ӱ྽ൌ২ 61

ie = num
elseif(iam .eq. np-1) then
s = 1.0
is = iam*num
ie = n - 1
xi = is * h
else
s = 0.0
is = iam*num
ie = is + num
xi = is * h
endif

do 20 i=is+1, ie
xi = xi + h
s = s + 4.0/(1.0+xi*xi)
20 continue

call mpi_reduce(s, pi, 1, mpi_double_precision, mpi_sum,


& 0, comm, ierr)

if(iam .eq. 0) then


pi = h*pi

write(*, *) ’The pi = ’, pi
endif
call mpi_finalize(ierr)

end
62 ֻ໴ᅣ ཨ༏Ԯ‫־‬щӱࢤ१ MPI
ֻੂᅣ MPI ѩྛߌ࣢ܵ৘‫ݦ‬ඔ
ᄝ MPI ѩྛӱ྽ᇏ, с҂ॖഒ֥‫ؽ‬۱‫ݦ‬ඔ൞ MPI_Init( ) ‫ ބ‬MPI_Finalize( ). ෱
ૌ֥བྷ༥‫ק‬ၬೂ༯:

MPI INIT
C int MPI_Init( int *argc, char ***argv )
F MPI_INIT( IERROR )
INTEGER IERROR

ႮႿ ANSI C ֥ᇶӱ྽ main ࢤ൳ҕඔ argc ‫ ބ‬argv, ೂՎ൐Ⴈ MPI_Init ॖࡼᆃུҕ


ඔԮෂ֞ૄ۱ࣉӱᇏ. ᄝ Fortran ӱ྽ᇏ, MPI_INIT ᆺْ߭၂۱հ༂઒. ᆃ۱‫ݦ‬ඔԚ൓
߄ MPI ѩྛӱ྽֥ᆳྛߌ࣢, ෱сྶᄝ‫ט‬Ⴈ෮Ⴕః෱ MPI ‫ݦ‬ඔ (Ԣ MPI_INITIALIZED)
ᆭభФ‫ט‬Ⴈ, ѩ౏ᄝ၂۱ MPI ӱ྽ᇏ, ᆺିФ‫ט‬Ⴈ၂Ց.

MPI FINALIZE
C int MPI_Finalize( void )
F MPI_FINALIZE( IERROR )
INTEGER IERROR

ᆃ۱‫ݦ‬ඔౢԢ MPI ߌ࣢֥෮Ⴕሑ෿. ࠧ၂֌෱Ф‫ט‬Ⴈ, ෮Ⴕ MPI ‫ݦ‬ඔ‫׻‬҂ିᄜ‫ט‬Ⴈ, ః


ᇏЇও MPI_INIT.
ᄝ၂۱ӱ྽ᇏ, ೂ‫ݔ‬҂ౢԣ൞‫טࣜၘڎ‬Ⴈਔ MPI_INIT, ॖၛ൐Ⴈ MPI_INITIALIZED
ট࡟Ұ, ෱൞ື၂֥ॖၛᄝ‫ט‬Ⴈ MPI_INIT ᆭభ൐Ⴈ֥‫ݦ‬ඔ.

MPI INITIALIZED
C int MPI_Initialized( int flag )
F MPI_INITIALIZED( FLAG, IERROR )
LOGICAL FLAG
INTEGER IERROR

ҕඔඪૼ

OUT FLAG, ೂ‫ݔ‬ MPI_INIT Ф‫ט‬Ⴈ, ْ߭ᆴູ TRUE, ‫ڎ‬ᄵູ FALSE.

ਸ਼ຓᄝ MPI ᇏߎิ‫܂‬ਔ၂۱Ⴈট࡟Ұԛ‫ޅ‬ᇕհ༂֥‫ݦ‬ඔ MPI_ERROR_STRING, ෱ࡼ


۳ԛհ༂ྐ༏.

63
64 ֻੂᅣ MPI ѩྛߌ࣢ܵ৘‫ݦ‬ඔ

MPI ERROR STRING


C int MPI_Error_string( int errorcode, char *string, int *len )
F MPI_ERROR_STRING( ERRORCODE, STRING, LEN, IERROR )
INTEGER ERRORCODE, LEN, IERROR
CHARACTER*(*) STRING

ҕඔඪૼ

IN ERRORCODE, Ⴎ MPI ‫ݦ‬ඔْ֥߭հ༂઒.

OUT STRING, ؓႋ ERRORCODE ֥հ༂ྐ༏.

OUT LEN, հ༂ྐ༏ STRING ֥Ӊ؇.

ᄝ൐ႨՎ‫ݦ‬ඔൈ, ႋᇿၩ STRING ֥Ӊ؇ቋཬႋູ MPI_MAX_ERROR_STRING.


ֻ௾ᅣ MPI ࣉӱ॥ᇅ‫ݦ‬ඔ
ᄝᆃ၂ᅣᇏ, ࢺകაࣉӱቆႵܱ֥၂ུࠎЧ‫ݦ‬ඔ, ఃᇏЇওೂ‫ࡹޅ‬৫ࣉӱቆ‫ބ‬๙ྐ
ሰ, ਲࠃ൐Ⴈᆃུ‫ݦ‬ඔᄝൌ࠽ӱ྽ഡ࠹ᇏ߶ջটऍնٚь.

§7.1 MPI ࣉӱቆҠቔ‫ݦ‬ඔ


MPI COMM GROUP
C int MPI_Comm_group( MPI_Comm comm, MPI_Group *group )
F MPI_COMM_GROUP( COMM, GROUP, IERROR )
INTEGER COMM, GROUP, IERROR

ҕඔඪૼ

IN COMM, ๙ྐሰ.

OUT GROUP, ؓႋ COMM ֥ࣉӱቆ.

MPI_COMM_GROUP ᆃ۱‫ݦ‬ඔ൞Ⴈটࡹ৫၂۱๙ྐሰؓႋ֥ྍࣉӱቆ, ᆭުࣼॖၛؓՎࣉӱ


ቆࣉྛླေ֥Ҡቔ.

MPI GROUP FREE


C int MPI_group_free( MPI_Group *group )
F MPI_GROUP_FREE( GROUP, IERROR )
INTEGER GROUP, IERROR

ҕඔඪૼ

INOUT GROUP, ൤٢ࣉӱቆѩْ߭ MPI_GROUP_NULL.

֒ MPI_GROUP_FREE Ф‫ט‬Ⴈᆭު, ಩‫ܱޅ‬ႿՎࣉӱቆ֥Ҡቔࡼ൪ູ໭ི.

MPI GROUP SIZE


C int MPI_Group_size( MPI_Group group, int *size )
F MPI_GROUP_SIZE( GROUP, SIZE, IERROR )
INTEGER GROUP, SIZE, IERROR

ҕඔඪૼ

IN GROUP, ࣉӱቆ.

OUT SIZE, ࣉӱቆᇏ֥ࣉӱ۱ඔ.

65
66 ֻ௾ᅣ MPI ࣉӱ॥ᇅ‫ݦ‬ඔ

ೂ‫ࣉݔ‬ӱቆ൞ MPI_GROUP_EMPTY, ᄵْ߭ᆴ SIZE ູ 0.

MPI GROUP RANK


C int MPI_Group_rank( MPI_Group group, int *rank )
F MPI_GROUP_RANK( GROUP, RANK, IERROR )
INTEGER GROUP, RANK, IERROR

ҕඔඪૼ

IN GROUP, ࣉӱቆ.

OUT RANK, ࣉӱᄝࣉӱቆᇏ֥щ‫ݼ‬.

ೂ‫ࣉݔ‬ӱ҂൞ࣉӱቆᇏ֥Ӯჴ, ᄵْ߭ᆴ RANK ູ MPI_UNDEFINED.

MPI GROUP TRANSLATE RANKS


C int MPI_Group_translate_ranks(MPI_Group group1,int n,int *ranks1,
MPI_Group group2, int *ranks2)
F MPI_GROUP_TRANSLATE_RANKS(GROUP1,N,RANKS1,GROUP2,RANKS2,IERROR)
INTEGER GROUP1, N, RANKS1(*), GROUP2, RANKS2(*), IERROR

ҕඔඪૼ

IN GROUP1, ࣉӱቆ 1.
IN N, RANKS1 ‫ބ‬ RANKS2 ᇏඔቆჭ෍۱ඔ.

IN RANKS1, ࣉӱቆ 1 ᇏႵིщ‫ݼ‬ቆӮ֥ඔቆ.

IN GROUP2, ࣉӱቆ 2.
OUT RANKS2, RANKS1 ᇏ֥ჭ෍ᄝࣉӱቆ 2 ᇏ֥ؓႋщ‫ݼ‬.

ೂ‫ݔ‬උႿࣉӱቆ 1 ֥ଖ۱ࣉӱॖၛᄝ RANKS1 ᇏᅳ֞, ‫ط‬ᆃ۱ࣉӱ҂උႿࣉӱቆ 2,


ᄵᄝ RANKS2 ᇏؓႋ RANKS1 ໊֥ᇂْ߭ᆴູ MPI_UNDEFINED.

MPI GROUP INCL


C int MPI_Group_incl( MPI_Group group, int n, int *ranks,
MPI_Group *newgroup)
F MPI_GROUP_INCL( GROUP, N, RANKS, NEWGROUP, IERROR )
INTEGER GROUP, N, RANKS(*), NEWGROUP, IERROR
§7.1 MPI ࣉӱቆҠቔ‫ݦ‬ඔ 67

ҕඔඪૼ

IN GROUP, ࣉӱቆ.

IN N, RANKS ඔቆᇏჭ෍֥۱ඔ‫ࣉྍބ‬ӱቆ֥նཬ.

IN RANKS, ࡼᄝྍࣉӱቆᇏԛགྷ֥ࣸࣉӱቆᇏ֥щ‫ݼ‬.

OUT NEWGROUP, Ⴎ RANKS ‫ק‬ၬ֥ඨ྽֝ԛ֥ྍࣉӱቆ.

MPI GROUP EXCL


C int MPI_Group_excl( MPI_Group group, int n, int *ranks,
MPI_Group *newgroup)
F MPI_GROUP_EXCL( GROUP, N, RANKS, NEWGROUP, IERROR )
INTEGER GROUP, N, RANKS(*), NEWGROUP, IERROR

ҕඔඪૼ

IN GROUP, ࣉӱቆ.

IN N, RANKS ඔቆᇏჭ෍֥۱ඔ.

IN RANKS, ᄝྍࣉӱቆᇏ҂ԛགྷ֥ࣸࣉӱቆᇏ֥щ‫ݼ‬.

OUT NEWGROUP, ࣸࣉӱቆᇏ҂ᄝ RANKS ৚֥ჭ෍ቆӮ֥ྍࣉӱቆ.

MPI GROUP UNION


C int MPI_Group_union( MPI_Group group1, MPI_Group group2,
MPI_Group *newgroup)
F MPI_GROUP_UNION( GROUP1, GROUP2, NEWGROUP, IERROR )
INTEGER GROUP1, GROUP2, NEWGROUP, IERROR

ҕඔඪૼ

IN GROUP1, ࣉӱቆ 1.
IN GROUP2, ࣉӱቆ 2.
OUT NEWGROUP, ࣉӱቆ 1 ‫ࣉބ‬ӱቆ 2 ֥ѩ.

MPI GROUP INTERSECTION


C int MPI_Group_intersection( MPI_Group group1, MPI_Group group2,
MPI_Group *newgroup)
F MPI_GROUP_INTERSECTION( GROUP1, GROUP2, NEWGROUP, IERROR )
INTEGER GROUP1, GROUP2, NEWGROUP, IERROR
68 ֻ௾ᅣ MPI ࣉӱ॥ᇅ‫ݦ‬ඔ

ҕඔඪૼ

IN GROUP1, ࣉӱቆ 1.
IN GROUP2, ࣉӱቆ 2.
OUT NEWGROUP, ࣉӱቆ 1 ‫ࣉބ‬ӱቆ 2 ֥ࢌ.

MPI GROUP DIFFERENCE


C int MPI_Group_difference( MPI_Group group1, MPI_Group group2,
MPI_Group *newgroup)
F MPI_GROUP_DIFFERENCE( GROUP1, GROUP2, NEWGROUP, IERROR )
INTEGER GROUP1, GROUP2, NEWGROUP, IERROR

ҕඔඪૼ

IN GROUP1, ࣉӱቆ 1.
IN GROUP2, ࣉӱቆ 2.
OUT NEWGROUP, ࣉӱቆ 1 ‫ࣉބ‬ӱቆ 2 ֥ҵ.

ၛഈܱႿࣉӱቆҠቔ֥‫ݦ‬ඔ‫ିۿ‬, ‫ބ‬ඔ࿐ᇏࠢ‫ކ‬ᄎෘཌྷ๝.

§7.2 MPI ๙ྐሰҠቔ

༯૫ࢺക֥ܱႿ๙ྐሰ֥Ҡቔ‫ބ‬ഈඍܱႿࣉӱቆҠቔ൅‫ٳ‬োර.

MPI COMM SIZE


C int MPI_Comm_size( MPI_Comm comm, int *size )
F MPI_COMM_SIZE( COMM, SIZE, IERROR )
INTEGER COMM, SIZE, IERROR

ҕඔඪૼ

IN COMM, ๙ྐሰ.

OUT SIZE, ๙ྐሰᇏ֥ࣉӱ۱ඔ.

MPI COMM RANK


C int MPI_Comm_rank( MPI_Comm comm, int *rank )
F MPI_COMM_RANK( COMM, RANK, IERROR )
INTEGER COMM, RANK, IERROR
§7.2 MPI ๙ྐሰҠቔ 69

ҕඔඪૼ

IN COMM, ๙ྐሰ.

OUT RANK, ๙ྐሰᇏ֥ࣉӱщ‫ݼ‬.

MPI COMM DUP


C int MPI_Comm_dup( MPI_Comm comm, MPI_Comm *newcomm )
F MPI_COMM_DUP( COMM, NEWCOMM, IERROR )
INTEGER COMM, NEWCOMM, IERROR

ҕඔඪૼ

IN COMM, ๙ྐሰ.

OUT NEWCOMM, COMM ๙ྐሰ֥‫گ‬ᇅ.

MPI COMM CREATE


C int MPI_Comm_create(MPI_Comm comm,MPI_Group group,MPI_Comm *newcomm)
F MPI_COMM_CREATE( COMM, GROUP, NEWCOMM, IERROR )
INTEGER COMM, GROUP, NEWCOMM, IERROR

ҕඔඪૼ

IN COMM, ๙ྐሰ.

IN GROUP, ๙ྐሰ COMM ֥၂۱ሰࠢ.

OUT NEWCOMM, ؓႋ GROUP ֥ྍ๙ྐሰ.

MPI COMM SPLIT


C int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm)
F MPI_COMM_SPLIT( COMM, COLOR, KEY, NEWCOMM, IERROR )
INTEGER COMM, COLOR, KEY, NEWCOMM, IERROR

ҕඔඪૼ

IN COMM, ๙ྐሰ.

IN COLOR, ሰࠢ॥ᇅᆴ.

IN KEY, ሰࠢᇏࣉӱщ‫֥ݼ‬ඨ྽.

OUT NEWCOMM, ႮՎӁള֥ྍ๙ྐሰ.


70 ֻ௾ᅣ MPI ࣉӱ॥ᇅ‫ݦ‬ඔ

ᆃ۱‫ݦ‬ඔ߃‫ ٳ‬COMM ෮ؓႋ֥ࣉӱቆູ҂ཌྷࢌ֥ሰࣉӱቆ, ૄ۱ሰࣉӱቆႵ၂۱‫܋‬


๝֥ᆴ COLOR, ࣼ൞ඪ, ૄ۱ሰࣉӱቆᇏЇ‫ ݣ‬COLOR ཌྷ๝֥෮Ⴕࣉӱ.

MPI COMM FREE


C int MPI_Comm_free( MPI_Comm *comm )
F MPI_COMM_FREE( COMM, IERROR )
INTEGER COMM, IERROR

ҕඔඪૼ

INOUT COMM, ๙ྐሰ.


ֻϖᅣ MPI ׄ֞ׄ๙ྐ‫ݦ‬ඔ
ׄ֞ׄ๙ྐ൞ᆷ၂ؓࣉӱᆭࡗ֥ඔऌሇߐ, ္ࣼ൞ඪ, ၂ш‫ؿ‬ෂඔऌਸ਼၂шࢤ൬ඔ
ऌ. ׄ֞ׄ๙ྐ൞ MPI ๙ྐࠏᇅ֥ࠎԤ, ෱‫ູٳ‬๝҄๙ྐ‫ބ‬ၳ҄๙ྐ‫ؽ‬ᇕࠏᇅ.

§8.1 ቅೖൔ๙ྐ‫ݦ‬ඔ
MPI SEND
C int MPI_Send(void* buf,int count,MPI_Datatype datatype,int dest,
int tag, MPI_Comm comm )
F MPI_SEND(BUF, COUNT, DATATYPE, DEST, TAG, COMM, IERROR )
<type> BUF(*)
INTEGER COUNT, DATATYPE, DEST, TAG, COMM, IERROR

ҕඔඪૼ

IN BUF, ෮ေ‫ؿ‬ෂཨ༏ඔऌ֥൮ֹᆶ.

IN COUNT, ‫ؿ‬ෂཨ༏ඔቆჭ෍֥۱ඔ.

IN DATATYPE, ‫ؿ‬ෂཨ༏֥ඔऌো྘.

IN DEST, ࢤ൬ཨ༏֥ࣉӱщ‫ݼ‬.

IN TAG, ཨ༏ѓద.

IN COMM, ๙ྐሰ.

ᆃ৚ COUNT ൞ BUF ֥ჭ෍۱ඔ‫ط‬҂൞ሳࢫඔ.

MPI RECV
C int MPI_Recv(void* buf,int count,MPI_Datatype datatype,int source,
int tag, MPI_Comm comm, MPI_Status *status )
F MPI_RECV(BUF, COUNT, DATATYPE, SOURCE, TAG, COMM, STATUS, IERROR )
<type> BUF(*)
INTEGER COUNT,DATATYPE,SOURCE,TAG,COMM,
STATUS(MPI_STATUS_SIZE),IERROR

71
72 ֻϖᅣ MPI ׄ֞ׄ๙ྐ‫ݦ‬ඔ

ҕඔඪૼ

OUT BUF, ࢤ൬ཨ༏ඔऌ֥൮ֹᆶ.

IN COUNT, ࢤ൬ཨ༏ඔቆჭ෍֥ቋն۱ඔ.

IN DATATYPE, ࢤ൬ཨ༏֥ඔऌো྘.

IN SOURCE, ‫ؿ‬ෂཨ༏֥ࣉӱщ‫ݼ‬.

IN TAG, ཨ༏ѓద.

IN COMM, ๙ྐሰ.

OUT STATUS, ࢤ൬ཨ༏ൈْ֥߭ሑ෿.

ᄝᆃ۱‫ݦ‬ඔᇏ, ॖၛ҂ᆷ‫ ק‬SOURCE ‫ ބ‬TAG, ‫ط‬Ⴈ MPI_ANY_SOURCE ‫ ބ‬MPI_ANY_TAG


টսู, ႨႿࢤ൬಩‫ࣉޅ‬ӱ‫ؿ‬ෂ֥ཨ༏ࠇ಩‫ޅ‬щ‫֥ݼ‬ཨ༏. ࢤ൬ཨ༏ൈْ֥߭ሑ෿ STATUS
ᄝ C ე࿽ᇏ൞Ⴈࢲ‫קܒ‬ၬ֥, ᄝ Fortran ᇏ൞Ⴈඔቆ‫ק‬ၬ֥, ఃᇏЇও MPI_SOURCE,
MPI_TAG ‫ ބ‬MPI_ERROR. Վຓ STATUS ߎЇ‫ࢤݣ‬൬ཨ༏ჭ෍֥۱ඔ, ֌෱҂൞ཁൔ۳ԛ֥,
ླေႨ֞ު૫۳ԛ֥‫ݦ‬ඔ MPI_GET_COUNT.
MPI ֥ࠎЧඔऌো྘‫ק‬ၬაཌྷႋ֥ Fortran ‫ ބ‬C ֥ඔऌো྘ؓᅶܱ༢ೂ༯:
Fortran ӱ྽ᇏॖ൐Ⴈ֥ MPI ඔऌো྘
MPI datatype Fortran datatype
MPI_INTEGER INTEGER
MPI_REAL REAL
MPI_DOUBLE_PRECISION DOUBLE PRECISION
MPI_COMPLEX COMPLEX
MPI_LOGICAL LOGICAL
MPI_CHARACTER CHARACTER(1)
MPI_BYTE
MPI_PACKED
C ӱ྽ᇏॖ൐Ⴈ֥ MPI ඔऌো྘
§8.1 ቅೖൔ๙ྐ‫ݦ‬ඔ 73

MPI datatype Fortran datatype


MPI_CHAR signed char
MPI_SHORT signed short int
MPI_INT signed int
MPI_LONG signed long int
MPI_UNSIGNED_CHAR unsigned char
MPI_UNSIGNED_SHORT unsigned short int
MPI_UNSIGNED_INT unsigned int
MPI_UNSIGNED_LONG unsigned long int
MPI_FLOAT float
MPI_DOUBLE double
MPI_LONG_DOUBLE long double
MPI_BYTE
MPI_PACKED
ᆃ৚ MPI_BYTE ‫ ބ‬MPI_PACKED ҂ؓႋ Fortran ࠇ C ᇏ֥಩‫ޅ‬ඔऌো྘, MPI_BYTE ൞Ⴎ
၂۱ሳࢫቆӮ֥, ‫ ط‬MPI_PACKED ࡼᄝު૫ࢺക. ֞ଢభູᆸ, ໡ૌၘࣜॖၛщཿ၂ུࡥ
ֆ֥ MPI ӱ྽, ༯૫۳ԛ၂۱ MPI ӱ྽֥২ሰ, ໡ૌࢲ‫ކ‬ᆃ۱২ሰඪૼ၂۱ MPI ӱ྽
֥ቆӮ҆‫ٳ‬. ᇗׄླေᅧ໤֥ MPI ‫ݦ‬ඔႵԚ൓߄ѩྛߌ࣢֥‫ݦ‬ඔ MPI_INIT, ֤֞Чࣉ
ӱ֥щ‫ݦݼ‬ඔ MPI_COMM_RANK, ֤֞ಆ҆ࣉӱ۱ඔ֥‫ݦ‬ඔ MPI_COMM_SIZE, ๼ԛ MPI ѩ
ྛߌ࣢֥‫ݦ‬ඔ MPI_FINALIZE, ၛࠣࣉྛཨ༏Ԯ‫ؽ֥־‬۱‫ݦ‬ඔ MPI_SEND ‫ ބ‬MPI_RECV.
২ 8.1.1 ࡌഡ၂‫܋‬Ⴕ p ۱ࣉӱ, ᄝࣉӱщ‫ ູݼ‬myid (myid= 0, . . . , p − 1) ֥ࣉӱᇏႵ၂
۱ᆜඔ m, ໡ૌေϜ m Ԯෂ֞ࣉӱ (myid + 1) mod p ᇏ.
program ring
c c The header file mpif.h must be included when you use MPI
fuctions. c
include ’mpif.h’
integer myid, p, mycomm, ierr, m, status(mpi_status_size),
& next, front, mod, n
c c Create MPI parallel environment and get the necessary data. c
call mpi_init( ierr )
call mpi_comm_dup( mpi_comm_world, mycomm, ierr)
call mpi_comm_rank( mycomm, myid, ierr )
call mpi_comm_size( mycomm, p, ierr )
c c Beginning the main parallel work on each process. c
m = myid
front = mod(p+myid-1, p)
next = mod(myid+1, p)
74 ֻϖᅣ MPI ׄ֞ׄ๙ྐ‫ݦ‬ඔ

c c Communication with each other. c


if(myid .eq. 0) then
call mpi_recv(n, 1, mpi_integer, front, 1, mycomm, status, ierr)
call mpi_send(m, 1, mpi_integer, next, 1, mycomm, ierr)
m = n
else
call mpi_send(m, 1, mpi_integer, next, 1, mycomm, ierr)
call mpi_recv(m, 1, mpi_integer, front, 1, mycomm, status, ierr)
endif
c c Ending of parallel work. c
print *, ’The value of m is ’, m, ’ on Process ’, myid
call mpi_comm_free(mycomm, ierr)
c c Remove MPI parallel environment. c
call mpi_finalize(ierr)
end

MPI GET COUNT


C int MPI_Get_count(MPI_Status status,MPI_Datatype datatype,int *count)
F MPI_GET_COUNT( STATUS, DATATYPE, COUNT, IERROR )
INTEGER STATUS(MPI_STATUS_SIZE), DATATYPE, COUNT, IERROR

ҕඔඪૼ

IN STATUS, ࢤ൬ཨ༏ൈْ֥߭ሑ෿.

IN DATATYPE, ࢤ൬ཨ༏֥ඔऌো྘.

OUT COUNT, ࢤ൬ཨ༏ඔቆჭ෍֥۱ඔ.

ႮႿᄝࢤ൬ཨ༏ൈ൐Ⴈ֥൞ቋն۱ඔ, ູਔሙಒᆩ֡ࢤ൬ཨ༏֥۱ඔ, ࣼေ൐ႨՎ‫ݦ‬


ඔ.

MPI SENDRECV
C int MPI_Sendrecv(void *sendbuf,int sendcount,MPI_Datatype sendtype,
int dest,int sendtag,void *recvbuf, int recvcount,
MPI_Datatype recvtype, int source, int recvtag,
MPI_Comm comm, MPI_Status *status )
F MPI_SENDRECV(SENDBUF, SENDCOUNT, SENDTYPE, DEST, SENDTAG, RECVBUF,
RECVCOUNT,RECVTYPE,SOURCE,RECVTAG,COMM,STATUS,IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNT, SENDTYPE, DEST, SENDTAG, RECVCOUNT, RECVTYPE
SOURCE, RECVTAG, COMM, STATUS(MPI_STATUS_SIZE), IERROR
§8.1 ቅೖൔ๙ྐ‫ݦ‬ඔ 75

ҕඔඪૼ

IN SENDBUF, ෮ေ‫ؿ‬ෂཨ༏ඔऌ֥൮ֹᆶ.

IN SENDCOUNT, ‫ؿ‬ෂཨ༏ඔቆჭ෍֥۱ඔ.

IN SENDTYPE, ‫ؿ‬ෂཨ༏֥ඔऌো྘.

IN DEST, ࢤ൬ཨ༏֥ࣉӱщ‫ݼ‬.

IN SENDTAG, ‫ؿ‬ෂཨ༏ѓద.

OUT RECVBUF, ࢤ൬ཨ༏ඔऌ֥൮ֹᆶ.

IN RECVCOUNT, ࢤ൬ཨ༏ඔቆჭ෍֥ቋն۱ඔ.

IN RECVTYPE, ࢤ൬ཨ༏֥ඔऌো྘.

IN SOURCE, ‫ؿ‬ෂཨ༏֥ࣉӱщ‫ݼ‬.

IN RECVTAG, ࢤ൬ཨ༏ѓద.

IN COMM, ๙ྐሰ.

OUT STATUS, ࢤ൬ཨ༏ൈْ֥߭ሑ෿.

ᆃ൞‫ؿ‬ෂཨ༏‫ࢤބ‬൬ཨ༏ቆ‫ކ‬ᄝ၂ఏ֥၂۱‫ݦ‬ඔ, ‫ݺ‬ԩ൞҂Ⴈॉ੮༵‫ؿ‬ෂߎ൞༵ࢤ
൬ཨ༏. ᄝൕ২ 8.1.1 ᇏՖ๙ྐष൓֞๙ྐࢲඏ҆‫ٳ‬ॖႨೂ༯֥၂۱‫ݦ‬ඔটປӮ:
call mpi_sendrecv(m, 1, mpi_integer, next, 1, n, 1, mpi_integer,
& front, 1, mycomm, status, ierr)
m = n
ႮՎॖ࡮൐Ⴈ MPI_SENDRECV ॖၛ൐ӱ྽ࡥ߄, ۷ᇗေ֥൞ᄝ๙ྐ‫ݖ‬ӱᇏ҂ླေॉ
੮ଧ۱ࣉӱ༵‫ؿ‬ෂߎ൞༵ࢤ൬, Ֆ‫ط‬ॖၛх૧ཨ༏Ԯ‫ݖ־‬ӱᇏ֥ඵ෭.

MPI SENDRECV REPLACE


C int MPI_Sendrecv_replace(void *sendbuf,int count,MPI_Datatype datatype,
int dest,int sendtag,int source, int recvtag,
MPI_Comm comm, MPI_Status *status )
F MPI_SENDRECV_REPLACE(BUF, COUNT, DATATYPE, DEST, SENDTAG,
SOURCE, RECVTAG, COMM, STATUS, IERROR )
<type> BUF(*)
INTEGER COUNT, DATATYPE, DEST, SENDTAG, SOURCE, RECVTAG,
COMM, STATUS(MPI_STATUS_SIZE), IERROR
76 ֻϖᅣ MPI ׄ֞ׄ๙ྐ‫ݦ‬ඔ

ҕඔඪૼ

OUT BUF, ‫ؿ‬ෂ‫ࢤބ‬൬ཨ༏ඔऌ֥൮ֹᆶ.

IN COUNT, ‫ؿ‬ෂ‫ࢤބ‬൬ཨ༏ඔቆჭ෍֥۱ඔ.

IN DATATYPE, ‫ؿ‬ෂ‫ࢤބ‬൬ཨ༏֥ඔऌো྘.

IN DEST, ࢤ൬ཨ༏֥ࣉӱщ‫ݼ‬.

IN SENDTAG, ‫ؿ‬ෂཨ༏ѓద.

IN SOURCE, ‫ؿ‬ෂཨ༏֥ࣉӱщ‫ݼ‬.

IN RECVTAG, ࢤ൬ཨ༏ѓద.

IN COMM, ๙ྐሰ.

OUT STATUS, ࢤ൬ཨ༏ൈْ֥߭ሑ෿.

ᄝᆃ۱‫ݦ‬ඔᇏ, ‫ؿ‬ෂ‫ࢤބ‬൬൐Ⴈ๝၂۱ཨ༏ߏԊ౵ BUF. ၹՎൕ২ 8.1.1 ֥๙ྐ҆‫ٳ‬


ॖࣉ၂҄‫ڿ‬ཿӮೂ༯֥ྙൔ:
call mpi_sendrecv_replace(m, 1, mpi_integer, next, 1,
& front, 1, mycomm, status, ierr)
ᄝࣉྛߌྙ๙ྐൈ, ൐Ⴈ MPI_SENDRECV_REPLACE ൞٤ӈٚь֥. ູਔ۷ٚь൐ႨՎ‫ݦ‬
ඔ, MPI ‫ק‬ၬਔ၂۱ॢࣉӱ MPI_PROC_NULL, ೂ‫ݔ‬๙ྐҐႨᆃ۱ॢࣉӱࡼ҂ఏ಩‫ޅ‬ቔႨ.
бೂᄝൕ২ 8.1.1 ᇏ, ೂ‫ݔ‬໡ૌ҂ླေՖֻ p − 1 ۱ࣉӱཟֻ 0 ۱ࣉӱԮෂ m, ᄵॖႨ
ೂ༯ٚൔটൌགྷ:
......
if(myid .eq. 0) front = MPI_PROC_NULL
if(myid .eq. p-1) next = MPI_PROC_NULL
call mpi_sendrecv_replace(m, 1, mpi_integer, next, 1,
& front, 1, mycomm, status, ierr)

MPI PROBE
C int MPI_Probe(int source,int tag,MPI_Comm comm,MPI_Status *status )
F MPI_PROBE( SOURCE, TAG, COMM, STATUS, IERROR )
INTEGER SOURCE, TAG, COMM, STATUS(MPI_STATUS_SIZE), IERROR

ҕඔඪૼ

IN SOURCE, ‫ؿ‬ෂཨ༏ࣉӱ֥щ‫ݼ‬.

IN TAG, ࢤ൬ཨ༏֥ѓద.

IN COMM, ๙ྐሰ.

OUT STATUS, ْ߭֞ղཨ༏֥ሑ෿.


§8.2 ٤ቅೖൔ๙ྐ‫ݦ‬ඔ 77

Վ‫ݦ‬ඔა༯૫۳ԛ֥ MPI_IPROBE ֥‫ࠎିۿ‬Чোර, ֌൞ MPI_PROBE ၂‫ק‬ေ֩֞ཨ


༏Ҍْ߭.

MPI IPROBE
C int MPI_Iprobe(int source, int tag, MPI_Comm comm, int* flag,
MPI_Status *status )
F MPI_IPROBE( SOURCE, TAG, COMM, FLAG, STATUS, IERROR )
LOGICAL FLAG
INTEGER SOURCE, TAG, COMM, STATUS(MPI_STATUS_SIZE), IERROR

ҕඔඪૼ

IN SOURCE, ‫ؿ‬ෂཨ༏ࣉӱ֥щ‫ݼ‬.

IN TAG, ࢤ൬ཨ༏֥ѓద.

IN COMM, ๙ྐሰ.

OUT FLAG, ೂ‫ݔ‬ᆷ‫ק‬ཨ༏ၘࣜղ֞, FLAG ْ߭ᆴູ TRUE.


OUT STATUS, ْ߭֞ղཨ༏֥ሑ෿.

ᆃ۱‫ݦ‬ඔؓႮ SOURCE, TAG ‫ ބ‬COMM ಒ‫֥ק‬ཨ༏൞‫֞ڎ‬ղ, ෱‫ࡼ׻‬৫ْࠧ߭. ᆃ


৚ SOURCE ‫ ބ‬TAG ๝ MPI_RECV ᇏ၂ဢ, ॖၛႨ๙஥‫( ژ‬wildcard) MPI_ANY_SOURCE ‫ބ‬
MPI_ANY_TAG টսู.

§8.2 ٤ቅೖൔ๙ྐ‫ݦ‬ඔ
٤ቅೖൔ๙ྐ‫ݦ‬ඔ൞ᆷᄝ๙ྐ‫ݖ‬ӱᇏ, ҂ླေ֩ր๙ྐࢲඏْࣼ߭, ๙ӈᆃᇕ๙ྐ‫ݖ‬
ӱࢌႮ࠹ෘࠏ֥ު෻টԩ৘. ೂ‫࠹ݔ‬ෘࠏ༢๤ิ‫܂‬႗ࡱᆦӻ٤ቅೖൔ๙ྐ‫ݦ‬ඔ, ࣼॖၛ
൐࠹ෘა๙ྐᄝൈࡗഈ֥ᇗ‫ן‬, Ֆ‫ۚิط‬ѩྛ࠹ෘི֥ੱ.

MPI ISEND
C int MPI_Isend(void* buf,int count,MPI_Datatype datatype,int dest,
int tag, MPI_Comm comm, MPI_Request *request )
F MPI_ISEND(BUF, COUNT, DATATYPE, DEST, TAG, COMM, REQUEST, IERROR)
<type> BUF(*)
INTEGER COUNT, DATATYPE, DEST, TAG, COMM, REQUEST, IERROR
78 ֻϖᅣ MPI ׄ֞ׄ๙ྐ‫ݦ‬ඔ

ҕඔඪૼ

IN BUF, ෮ေ‫ؿ‬ෂཨ༏ඔऌ֥൮ֹᆶ.

IN COUNT, ‫ؿ‬ෂཨ༏ඔቆჭ෍֥۱ඔ.

IN DATATYPE, ‫ؿ‬ෂཨ༏֥ඔऌো྘.

IN DEST, ࢤ൬ཨ༏֥ࣉӱщ‫ݼ‬.

IN TAG, ཨ༏ѓద.

IN COMM, ๙ྐሰ.

OUT REQUEST, ౨౰ओѣၛСࡼটҰ࿘.

MPI IRECV
C int MPI_Irecv(void* buf,int count,MPI_Datatype datatype,int source,
int tag, MPI_Comm comm, MPI_Request *request )
F MPI_IRECV(BUF, COUNT, DATATYPE, SOURCE, TAG, COMM, REQUEST, IERROR)
<type> BUF(*)
INTEGER COUNT, DATATYPE, SOURCE, TAG, COMM, REQUEST, IERROR

ҕඔඪૼ

OUT BUF, ࢤ൬ཨ༏ඔऌ֥൮ֹᆶ.

IN COUNT, ࢤ൬ཨ༏ඔቆჭ෍֥۱ඔ.

IN DATATYPE, ࢤ൬ཨ༏֥ඔऌো྘.

IN SOURCE, ‫ؿ‬ෂཨ༏֥ࣉӱщ‫ݼ‬.

IN TAG, ཨ༏ѓద.

IN COMM, ๙ྐሰ.

OUT REQUEST, ౨౰ओѣၛСࡼটҰ࿘.

MPI_ISEND ‫ ބ‬MPI_IRECV ҂ླေ֩ր‫ؿ‬ෂࠇࢤ൬ཨ༏ປӮࣼॖᆳྛఃჅ֥಩ༀ, ु


‫ؿ‬ෂࠇࢤ൬‫ݖ‬ӱ൞‫ࢲڎ‬ඏ, Ⴕ༯૫֥၂ུ‫ݦ‬ඔ:

MPI WAIT
C int MPI_Wait( MPI_Request *request, MPI_Status *status )
F MPI_WAIT( REQUEST, STATUS, IERROR )
INTEGER REQUEST, STATUS(MPI_STATUS_SIZE), IERROR

ҕඔඪૼ

INOUT REQUEST, ౨౰ओѣ.

OUT STATUS, ‫ؿ‬ෂࠇࢤ൬ཨ༏֥ሑ෿.


§8.2 ٤ቅೖൔ๙ྐ‫ݦ‬ඔ 79

ೂ‫ ݔ‬REQUEST ෮ᆷ֥ҠቔၘࣜປӮ, MPI_WAIT ࡼࢲඏ֩րሑ෿.

MPI TEST
C int MPI_Test(MPI_Request *request, int* flag, MPI_Status *status)
F MPI_TEST( REQUEST, FLAG, STATUS, IERROR )
LOGICAL FLAG
INTEGER REQUEST, STATUS(MPI_STATUS_SIZE), IERROR

ҕඔඪૼ

INOUT REQUEST, ౨౰ओѣ.

OUT FLAG, REQUEST ෮ᆷ֥ҠቔၘࣜປӮْ߭ᆴູ TRUE.


OUT STATUS, ‫ؿ‬ෂࠇࢤ൬ཨ༏֥ሑ෿.

ၛഈᆃ‫ؽ‬۱‫ݦ‬ඔᇏ STATUS ؓ‫ؿ‬ෂཨ༏Ҡቔ൞ીႵ‫ק‬ၬ֥, ື၂ॖᄝ‫ؿ‬ෂཨ༏Ҡቔ


ᇏ൐Ⴈ STATUS ֥൞Ұ࿘‫ݦ‬ඔ MPI_TEST_CANCELLED.

MPI REQUEST FREE


C int MPI_Request_free( MPI_Request *request )
F MPI_REQUEST_FREE( REQUEST, IERROR )
INTEGER REQUEST, IERROR

ҕඔඪૼ

INOUT REQUEST, ౨౰ओѣ, ْ߭ᆴູ MPI_REQUEST_NULL.

ၛഈ൞ؓֆ۱ REQUEST ࣉྛҰ࿘֥‫ݦ‬ඔ, ೂ‫ݔ‬ေؓ‫؟‬۱౨౰ओѣࣉྛҰ࿘, Ⴕ༯૫


֥၂ུ‫ݦ‬ඔॖၛ൐Ⴈ.
MPI WAITANY
C int MPI_Waitany( int count, MPI_Request *array_of_requests,
int *index, MPI_Status *status )
F MPI_WAITANY(COUNT, ARRAY_OF_REQUESTS, INDEX, STATUS, IERROR)
INTEGER COUNT, ARRAY_OF_REQUESTS(*), INDEX,
STATUS(MPI_STATUS_SIZE), IERROR

ҕඔඪૼ

IN COUNT, ౨౰ओѣ֥۱ඔ.

INOUT ARRAY_OF_REQUESTS, ౨౰ओѣඔቆ.

OUT INDEX, ၘࣜປӮ๙ྐҠቔ֥ओѣᆷѓ.

OUT STATUS, ཨ༏֥ሑ෿.


80 ֻϖᅣ MPI ׄ֞ׄ๙ྐ‫ݦ‬ඔ

ᆃ۱‫ݦ‬ඔ֒෮Ⴕ౨౰ओѣᇏᇀഒႵ၂۱ၘࣜປӮ๙ྐҠቔ, ْࣼ߭, ೂ‫ݔ‬Ⴕ‫؟‬Ⴟ၂۱


౨౰ओѣၘࣜປӮ, MPI_WAITANY ࡼෛࠏ࿊ᄴఃᇏ֥၂۱ѩ৫ْࠧ߭.

MPI TESTANY
C int MPI_Testany( int count, MPI_Request *array_of_requestS,
int *index, int *flag, MPI_Status *status )
F MPI_TESTANY(COUNT,ARRAY_OF_REQUESTS,INDEX,FLAG,STATUS,IERROR)
LOGICAL FLAG
INTEGER COUNT, ARRAY_OF_REQUESTS(*), INDEX,
STATUS(MPI_STATUS_SIZE), IERROR

ҕඔඪૼ

IN COUNT, ౨౰ओѣ֥۱ඔ.

INOUT ARRAY_OF_REQUESTS, ౨౰ओѣඔቆ.

OUT INDEX, ၘࣜປӮ๙ྐҠቔ֥ओѣᆷѓ.

OUT FLAG, ೂ‫ݔ‬Ⴕ၂۱ၘࣜປӮ, ᄵ FLAG=TRUE.


OUT STATUS, ཨ༏֥ሑ෿.

ᆃ۱‫ݦ‬ඔ໭ંႵીႵ๙ྐҠቔປӮ‫ࡼ׻‬৫ْࠧ߭.

MPI WAITALL
C int MPI_Waitall( int count, MPI_Request *array_of_requests,
MPI_Status *array_of_statuses )
F MPI_WAITALL(COUNT,ARRAY_OF_REQUESTS,ARRAY_OF_STATUSES,IERROR)
INTEGER COUNT, ARRAY_OF_REQUESTS(*),
ARRAY_OF_STATUSES(MPI_STATUS_SIZE, *), IERROR

ҕඔඪૼ

IN COUNT, ౨౰ओѣ֥۱ඔ.

INOUT ARRAY_OF_REQUESTS, ౨౰ओѣඔቆ.

INOUT ARRAY_OF_STATUSES, ෮Ⴕཨ༏֥ሑ෿ඔቆ.

ᆃ۱‫ݦ‬ඔ֒෮Ⴕ๙ྐҠቔປӮᆭުҌْ߭, ‫ڎ‬ᄵࡼ၂ᆰ֩ր.
§8.2 ٤ቅೖൔ๙ྐ‫ݦ‬ඔ 81

MPI TESTALL
C int MPI_Testall( int count, MPI_Request *array_of_requests,
int *flag, MPI_Status *array_of_statuses )
F MPI_TESTALL(COUNT,ARRAY_OF_REQUESTS,FLAG,ARRAY_OF_STATUSES,IERROR)
LOGICAL FLAG
INTEGER COUNT, ARRAY_OF_REQUESTS(*),
ARRAY_OF_STATUSES(MPI_STATUS_SIZE, *), IERROR

ҕඔඪૼ

IN COUNT, ౨౰ओѣ֥۱ඔ.

INOUT ARRAY_OF_REQUESTS, ౨౰ओѣඔቆ.

OUT FLAG, ೂ‫ݔ‬Ⴕ၂۱ીປӮ, ᄵ FLAG=FALSE.


INOUT ARRAY_OF_STATUSES, ෮Ⴕཨ༏֥ሑ෿ඔቆ.

ᆃ۱‫ݦ‬ඔ໭ં෮Ⴕ๙ྐҠቔ൞‫ڎ‬ປӮ‫ࡼ׻‬৫ْࠧ߭.

MPI CANCEL
C int MPI_Cancel( MPI_Request *request )
F MPI_CANCEL( REQUEST, IERROR )
INTEGER REQUEST, IERROR

ҕඔඪૼ

INOUT REQUEST, ౨౰ओѣ.

ᆃ۱‫ݦ‬ඔႨট౼ཨ၂۱‫ؿ‬ෂࠇࢤ൬Ҡቔ, ఃުေ൐Ⴈ MPI_WAIT ࠇ MPI_TEST ֩‫ݦ‬


ඔ, ၹՎ൐ႨՎ‫ݦ‬ඔ߶෥ാྸ‫ੱི؟‬. ֌൞ေᆩܱ֡Ⴟ REQUEST ౨౰ओѣ֥Ҡቔ൞‫ၘڎ‬
ࣜФ౼ཨ, ߎေ൐Ⴈ༯૫֥࡟ҩ‫ݦ‬ඔ:

MPI TEST CANCELLED


C int MPI_Test_cancelled( MPI_Status *status, int *flag )
F MPI_TEST_CANCELLED( STATUS, FLAG, IERROR )
LOGICAL FLAG
INTEGER REQUEST, IERROR

ҕඔඪૼ

IN STATUS, ཨ༏֥ሑ෿.

OUT FLAG, ೂ‫ࣜၘݔ‬౼ཨ, ᄵ FLAG=TRUE.


82 ֻϖᅣ MPI ׄ֞ׄ๙ྐ‫ݦ‬ඔ

§8.3 ห൹֥ׄ֞ׄ๙ྐ‫ݦ‬ඔ
MPI SEND INIT
C int MPI_Send_init(void* buf,int count,MPI_Datatype datatype,int dest,
int tag, MPI_Comm comm, MPI_Request *request )
F MPI_SEND_INIT(BUF, COUNT, DATATYPE, DEST, TAG, COMM, REQUEST, IERROR )
<type> BUF(*)
INTEGER COUNT, DATATYPE, DEST, TAG, COMM, REQUEST, IERROR

ҕඔඪૼ

IN BUF, ෮ေ‫ؿ‬ෂཨ༏ඔऌ֥൮ֹᆶ.

IN COUNT, ‫ؿ‬ෂཨ༏ඔቆჭ෍֥۱ඔ.

IN DATATYPE, ‫ؿ‬ෂཨ༏֥ඔऌো྘.

IN DEST, ࢤ൬ཨ༏֥ࣉӱщ‫ݼ‬.

IN TAG, ཨ༏ѓద.

IN COMM, ๙ྐሰ.

OUT REQUEST, ౨౰ओѣၛСࡼটҰ࿘.

MPI RECV INIT


C int MPI_Recv_init(void* buf,int count,MPI_Datatype datatype,int source,
int tag, MPI_Comm comm, MPI_Request *request )
F MPI_RECV_INIT(BUF, COUNT, DATATYPE, SOURCE, TAG, COMM, REQUEST, IERROR)
<type> BUF(*)
INTEGER COUNT, DATATYPE, SOURCE, TAG, COMM, REQUEST, IERROR

ҕඔඪૼ

OUT BUF, ࢤ൬ཨ༏ඔऌ֥൮ֹᆶ.

IN COUNT, ࢤ൬ཨ༏ඔቆჭ෍֥۱ඔ.

IN DATATYPE, ࢤ൬ཨ༏֥ඔऌো྘.

IN SOURCE, ‫ؿ‬ෂཨ༏֥ࣉӱщ‫ݼ‬.

IN TAG, ཨ༏ѓద.

IN COMM, ๙ྐሰ.

OUT REQUEST, ౨౰ओѣၛСࡼটҰ࿘.


§8.3 ห൹֥ׄ֞ׄ๙ྐ‫ݦ‬ඔ 83

MPI_SEND_INIT ‫ ބ‬MPI_RECV_INIT ൞‫ؽ‬۱ӻࣲྟ๙ྐ‫ݦ‬ඔ, ෱ૌ֥ҕඔ‫ބ‬భ૫ࢃ֞


֥ၳ҄๙ྐᇏ֥‫ؿ‬ෂაࢤ൬ཌྷ๝, ႮՎॖၛϜ๙ྐၛ๙֡ٚൔࡹ৫ఏটؓႋܱ༢, Ֆ‫ิط‬
ۚ๙ྐིੱ. ֌൞ࣇႵᆃ‫ؽ‬۱‫ݦ‬ඔߎ҂ି‫ܔ‬ղ֞๙ྐ֥ଢ֥, ෱ૌߎླေႨ MPI_START
ࠇ MPI_STARTALL টࠗࠃ.

MPI START
C int MPI_Start( MPI_Request *request )
F MPI_START( REQUEST, IERROR )
INTEGER REQUEST, IERROR

ҕඔඪૼ

INOUT REQUEST, ౨౰ओѣ.

ᄝ൐Ⴈ MPI_START ᆭު, MPI_SEND_INIT ‫ ބ‬MPI_RECV_INIT ࣼ๝ၳ҄‫ؿ‬ෂაࢤ൬.

MPI STARTALL
C int MPI_Startall( int count, MPI_Request *array_of_request )
F MPI_STARTALL( COUNT, ARRAY_OF_REQUEST, IERROR )
INTEGER COUNT, ARRAY_OF_REQUEST, IERROR

ҕඔඪૼ

IN COUNT, ླေࠗࠃ֥౨౰ओѣ۱ඔ.

INOUT ARRAY_OF_REQUEST, ౨౰ओѣඔቆ.

২ 8.3.1 ᄝൕ২ 8.1.1 ᇏ, ᆜඔ m ᆺ൞ᄝࣉӱߌᇏཟభ၍‫׮‬၂Ց, ೂ‫ݔ‬໡ૌေ၍‫؟׮‬Ց,


ॖၛ൐Ⴈ༯૫֥ӱ྽ൌགྷ:
program mring
include ’mpif.h’
c
integer iter
parameter(iter = 3)
integer myid, p, mycomm, ierr, m, status(mpi_status_size, 2),
& next, front, mod, n, i, requests(2)
c
call mpi_init( ierr )
call mpi_comm_dup( mpi_comm_world, mycomm, ierr)
call mpi_comm_rank( mycomm, myid, ierr )
call mpi_comm_size( mycomm, p, ierr )
print *, ’Process ’, myid, ’ of ’, p, ’ is running’
84 ֻϖᅣ MPI ׄ֞ׄ๙ྐ‫ݦ‬ඔ

c
m = myid
front = mod(p+myid-1, p)
next = mod(myid+1, p)
call mpi_send_init(m, 1, mpi_integer, next, 1, mycomm,
& requests(1), ierr)
call mpi_recv_init(n, 1, mpi_integer, front, 1, mycomm,
& requests(2), ierr)
do 10 i=1, iter
call mpi_startall(2, requests, ierr)
call mpi_waitall(2, requests, status, ierr)
m = n
10 continue
print *, ’The value of m is ’, m, ’ on Process ’, myid
c
call mpi_comm_free(mycomm, ierr)
call mpi_finalize(ierr)
stop
end

§8.4 MPI ֥๙ྐଆൔ

భ૫෮ิ֥֞๙ྐଆൔ൞ѓሙ๙ྐଆൔ, ෱൞Ⴎ MPI ൌགྷᇏಒ‫֥ק‬, ॖି࿊ᄴ֥൞


ߏԊ౵ଆൔ (buffered-mode) ࠇ๝҄ଆൔ (synchronous-mode), Վຓ MPI ߎิ‫܂‬ਔࣼ࿂
ଆൔ (ready-mode). ᆃུଆൔࣇؓ‫ؿ‬ෂཨ༏ఏቔႨ, ໭ંႨ಩‫ޅ‬ଆൔ‫ؿ‬ෂ֥ཨ༏‫׻‬ॖႨ
၂۱ࢤ൬‫ݦ‬ඔটປӮࢤ൬ཨ༏. ᄝ༯૫۳ԛ֥ა‫ؿ‬ෂཨ༏Ⴕܱ֥‫ݦ‬ඔ, ఃҕඔაؓႋѓሙ
๙ྐଆൔൈ൞ປಆ၂ᇁ֥, ၹՎᆃ৚໡ૌࣇ۳ԛ‫ݦ‬ඔ଀ሳࠣࡥေඪૼ.
• MPI_BSEND, ൐ႨߏԊ౵‫ؿ‬ෂཨ༏, ᆺေߏԊ౵ቀ‫ܔ‬ն, ‫ط‬҂ܵࢤ൬ࣉӱ൞‫ڎ‬ष൓ࢤ൬
෱‫ࡼ׻‬৫ْࠧ߭, ္ࣼ൞ඪ, ᄝ‫ؿ‬ෂཨ༏ൈ൞҂ླေ֩ր֥.
• MPI_SSEND, ෱ॖၛᄝીႵࢤ൬ྐ‫ݼ‬ൈࣼष൓‫ؿ‬ෂ, ֌ေ֩֞ࢤ൬ປӮᆭުҌିࢲඏ
๙ྐҠቔ, ‫ݺ‬ԩ൞໭ླႨ޼ሱ࠭ണ౨ߏԊ౵.
• MPI_RSEND, ᆺ֒ၘࣜႵࢤ൬ྐ‫ݼ‬ൈҌष൓‫ؿ‬ෂཨ༏, ‫ڎ‬ᄵࡼԛགྷհ༂.
• MPI_IBSEND, ၳ҄๙ྐ֥ MPI_BSEND.
• MPI_ISSEND, ၳ҄๙ྐ֥ MPI_SSEND.
• MPI_IRSEND, ၳ҄๙ྐ֥ MPI_RSEND.
• MPI_BSEND_INIT, ࡹ৫ሱ࠭ߏԊ౵֥ MPI_SEND_INIT.
• MPI_SSEND_INIT, ๝҄ଆൔ֥ MPI_SEND_INIT.
• MPI_RSEND_INIT, ࣼ࿂ଆൔ֥ MPI_SEND_INIT.
§8.4 MPI ֥๙ྐଆൔ 85

Ⴕܱཨ༏ߏԊ౵֥ܵ৘, ॖၛ൐Ⴈೂ༯֥‫ؽ‬۱‫ݦ‬ඔ:

MPI BUFFER ATTACH


C int MPI_Buffer_attach( void *buffer, int size )
F MPI_BUFFER_ATTACH( BUFFER, SIZE, IERROR )
<TYPE> BUFFER(*)
INTEGER SIZE, IERROR

ҕඔඪૼ

IN BUFFER, Ԛ൓߄ߏԊ౵֥൮ֹᆶ.

IN SIZE, ߏԊ౵οሳࢫ֥նཬ.

ᆃ۱‫ݦ‬ඔᆷૼ൐Ⴈཨ༏ߏԊ౵ଆൔ๙ྐൈႨଧ၂۱ߏԊ౵.

MPI BUFFER DETACH


C int MPI_Buffer_detach( void *buffer, int *size )
F MPI_BUFFER_DETACH( BUFFER, SIZE, IERROR )
<TYPE> BUFFER(*)
INTEGER SIZE, IERROR

ҕඔඪૼ

OUT BUFFER, ေҷཱྀ֥ߏԊ౵.

OUT SIZE, ْ߭ߏԊ౵֥ሳࢫඔ.


86 ֻϖᅣ MPI ׄ֞ׄ๙ྐ‫ݦ‬ඔ
ֻࣴᅣ MPI Ⴈ޼ሱ‫ק‬ၬ֥ඔऌো྘აյЇ

§9.1 Ⴈ޼‫ק‬ၬ֥ඔऌো྘
ᄝ MPI ᇏႨ޼‫ק‬ၬ֥ඔऌো྘‫ ބ‬C ე࿽ᇏ֥ࢲ‫ܒ‬൞٤ӈোර֥, ෱Їওඔऌো྘a
ඔऌӉ؇‫ބ‬ඔऌఏ൓໊ᇂ, ᆃ۱ྍ‫ק‬ၬ֥ඔऌো྘๝ః෱ MPI ‫ק‬ၬ֥ѓሙඔऌো྘၂
ဢ, ॖၛႨটቔູ‫ؿ‬ෂ‫ࢤބ‬൬ཨ༏֥ඔऌো྘. ؓႿᆃ۱ྍ‫ק‬ၬ֥ඔऌো྘, ऎֹุඪ෱
֥ቆӮॖၛ‫ۀ‬ওູೂ༯֥ྙའ૭ඍ:
• ෱Ї‫ݣ‬ਔ၂༢ਙ֥ჰ൓ඔऌো྘;
• ‫ބ‬၂༢ਙ֥ӫᆭູ໊၍ (displacement) ֥ᆜඔ.
ඔऌো྘ა໊၍൞Ӯؓԛགྷ֥, ᆃ၂༢ਙ֥ඔऌؓࣼ൞ӫᆭູো྘႘ഝ (type map). Ⴈ
ো྘႘ഝটіൕ၂۱ྍ֥ඔऌো྘ູ:

T ypemap = {(type0 , disp0 ), . . . , (typen−1 , dispn−1 )}

ᄝᆃ۱ྍ֥ඔऌো྘ᇏ, Їও໊၍൞ dispi ֥ჰ൓ඔऌো྘ typei , ఃᇏ i = 0, . . . , n − 1.


ೂ‫ܒޅ‬ᄯྍ֥ඔऌো྘໡ૌࡼᄝၛ༯ࣉྛབྷ༥ࢺക.

MPI TYPE CONTIGUOUS


C int MPI_Type_contiguous(int count, MPI_Datatype oldtype,
MPI_Datatype *newtype )
F MPI_TYPE_CONTIGUOUS( COUNT, OLDTYPE, NEWTYPE, IERROR )
INTEGER COUNT, OLDTYPE, NEWTYPE, IERROR

ҕඔඪૼ

IN COUNT, ᇗ‫گ‬٢ᄝ၂ఏ֥ OLDTYPE ֥ჭ෍۱ඔ.

IN OLDTYPE, ჰ൓ඔऌো྘.

OUT NEWTYPE, ྍ‫ܒ‬ᄯ֥ඔऌো྘.

ᆃ൞‫ܒ‬ᄯඔऌো྘ᇏቋࡥֆ֥၂ᇕ, ࣼ൞Ϝჰ൓ඔऌো྘ᇗ‫ گ‬COUNT Ց, ໡ૌई۱


ࡥֆ֥২ሰটඪૼః‫ݣ‬ၬ. ࡌഡ COUNT=5, OLDTYPE=INTEGER, ᄵ‫ט‬ႨՎ‫ݦ‬ඔᆭުӁള֥
ྍ֥ඔऌো྘ NEWTYPE ູ 5 ۱ᆜඔ.

MPI TYPE VECTOR


C int MPI_Type_vector( int count, int blocklength, int stride,
MPI_Datatype oldtype,MPI_Datatype *newtype )
F MPI_TYPE_VECTOR(COUNT,BLOCKLENGTH,STRIDE,OLDTYPE,NEWTYPE,IERROR)
INTEGER COUNT, BLOCKLENGTH, STRIDE, OLDTYPE, NEWTYPE, IERROR

87
88 ֻࣴᅣ MPI Ⴈ޼ሱ‫ק‬ၬ֥ඔऌো྘აյЇ

ҕඔඪૼ

IN COUNT, OLDTYPE ֥ॶ֥۱ඔ.

IN BLOCKLENGTH, ૄॶ֥Ӊ؇.

IN STRIDE, Ⴈ OLDTYPE ֥ჭ෍؇ਈ֥ૄॶఏ൓֥ࡗए.

IN OLDTYPE, ჰ൓ඔऌো྘.

OUT NEWTYPE, ྍ‫ܒ‬ᄯ֥ඔऌো྘.

ࡌഡ COUNT=3, BLOCKLENGTH=2, STRIDE=3, OLDTYPE=INTEGER, ᄵ‫ט‬ႨՎ‫ݦ‬ඔ֤֥֞


ྍඔऌো྘ NEWTYPE ູ 6 ۱ᆜඔቆӮ. ᆃ 6 ۱ᆜඔ൞ᄝჰ൓ඔቆᇏՖष൓౼ 2 ۱, ‫ۯ‬၂
۱ᄜ౼ 2 ۱, ᄜ‫ۯ‬၂۱ᄜ౼ 2 ۱‫ܒ‬Ӯ֥.

MPI TYPE HVECTOR


C int MPI_Type_hvector(int count, int blocklength, int stride,
MPI_Datatype oldtype, MPI_Datatype *newtype)
F MPI_TYPE_HVECTOR(COUNT,BLOCKLENGTH,STRIDE,OLDTYPE,NEWTYPE,IERROR)
INTEGER COUNT, BLOCKLENGTH, STRIDE, OLDTYPE, NEWTYPE, IERROR

ҕඔඪૼ

IN COUNT, OLDTYPE ֥ॶ֥۱ඔ.

IN BLOCKLENGTH, ૄॶ֥Ӊ؇.

IN STRIDE, Ⴈሳࢫඔ؇ਈ֥ૄॶఏ൓֥ࡗए.

IN OLDTYPE, ჰ൓ඔऌো྘.

OUT NEWTYPE, ྍ‫ܒ‬ᄯ֥ඔऌো྘.

ᆃ۱‫ݦ‬ඔေб MPI_TYPE_VECTOR ۷ऎ௴ђྟ, ֌൞෱֥ૄ၂ॶ൞‫קܥ‬҂э֥, ༯૫


ࡼࢺകэॶӉ؇֥ඔऌো྘ೂ‫ܒޅ‬ᄯ.

MPI TYPE INDEXED


C int MPI_Type_indexed( int count, int *array_of_blocklengths,
int *array_of_displacements,
MPI_Datatype oldtype, MPI_Datatype *newtype )
F MPI_TYPE_INDEXED(COUNT,ARRAY_OF_BLOCKLENGTHS,ARRAY_OF_DISPLACEMENTS,
OLDTYPE, NEWTYPE, IERROR )
INTEGER COUNT, ARRAY_OF_BLOCKLENGTHS(*), ARRAY_OF_DISPLACEMENTS(*),
OLDTYPE, NEWTYPE, IERROR
§9.1 Ⴈ޼‫ק‬ၬ֥ඔऌো྘ 89

ҕඔඪૼ

IN COUNT, OLDTYPE ֥ॶ֥۱ඔ.

IN ARRAY_OF_BLOCKLENGTHS, ૄॶӉ؇ඔቆ.

IN ARRAY_OF_DISPLACEMENTS, Ⴈჭ෍۱ඔ‫ק‬ၬ֥ૄॶ֥ఏ൓໊၍ਈඔቆ.

IN OLDTYPE, ჰ൓ඔऌো྘.

OUT NEWTYPE, ྍ‫ܒ‬ᄯ֥ඔऌো྘.

ᆃ৚ ARRAY_OF_BLOCKLENGTHS ‫ ބ‬ARRAY_OF_DISPLACEMENTS ൞ OLDTYPE ‫ק‬ၬ֥ჭ


෍۱ඔ؇ਈ֥, ‫ ط‬ARRAY_OF_DISPLACEMENTS ൞၂۱ཌྷؓᆴ. భඍ֥ MPI_TYPE_VECTOR
‫ݦ‬ඔ൞Վ‫ݦ‬ඔ֥ห২, ္ࠧ༯૫֥‫ؽ‬۱‫ט‬ႨӁളཌྷ๝֥ඔऌো྘.
MPI_TYPE_VECTOR(COUNT,BLOCKLENGTH,STRIDE,OLDTYPE,NEWTYPE,IERROR) ‫ބ‬
MPI_TYPE_INDEXED(COUNT,LENGTHS,DISPLACEMENTS,OLDTYPE,NEWTYPE,IERROR)
LENGTHS(i)=BLOCKLENGTH, DISPLACEMENTS(i)=i*STRIDE, i=0, ..., COUNT-1. ᄝ
ᆃ৚໡ૌ۳ԛ֥‫ݦ‬ඔ MPI_TYPE_INDEXED ໊֥၍ਈ൞Ⴎ OLDTYPE ‫ק‬ၬ֥ჭ෍۱ඔಒ‫ק‬
֥, ༯૫ࡼေ۳ԛ֥‫ݦ‬ඔ໊֥၍ਈ൞Ⴎሳࢫඔಒ‫֥ק‬.

MPI TYPE HINDEXED


C int MPI_Type_hindexed(int count, int *array_of_blocklengths,
int *array_of_displacements,
MPI_Datatype oldtype, MPI_Datatype *newtype )
F MPI_TYPE_HINDEXED(COUNT,ARRAY_OF_BLOCKLENGTHS,ARRAY_OF_DISPLACEMENTS,
OLDTYPE, NEWTYPE, IERROR )
INTEGER COUNT, ARRAY_OF_BLOCKLENGTHS(*), ARRAY_OF_DISPLACEMENTS(*),
OLDTYPE, NEWTYPE, IERROR

ҕඔඪૼ

IN COUNT, OLDTYPE ֥ॶ֥۱ඔ.

IN ARRAY_OF_BLOCKLENGTHS, ૄॶӉ؇ඔቆ.

IN ARRAY_OF_DISPLACEMENTS, Ⴈሳࢫඔ‫ק‬ၬ֥ૄॶ֥ఏ൓໊၍ਈඔቆ.

IN OLDTYPE, ჰ൓ඔऌো྘.

OUT NEWTYPE, ྍ‫ܒ‬ᄯ֥ඔऌো྘.

ၛഈ۳ԛ֥ܱႿඔऌো྘‫ܒ‬ᄯ‫ݦ‬ඔ‫׻‬൞ֆ၂֥ჰ൓ඔऌো྘, ༯૫ࡼ۳ԛ၂۱ቋ၂
Ϯ֥‫ܒ‬ᄯྍඔऌো྘֥‫ݦ‬ඔ.
90 ֻࣴᅣ MPI Ⴈ޼ሱ‫ק‬ၬ֥ඔऌো྘აյЇ

MPI TYPE STRUCT


C int MPI_Type_struct(int count, int *array_of_blocklengths,
int *array_of_displacements,
MPI_Datatype *array_of_types,MPI_Datatype *newtype)
F MPI_TYPE_STRUCT(COUNT, ARRAY_OF_BLOCKLENGTHS, ARRAY_OF_DISPLACEMENTS,
ARRAY_OF_TYPES, NEWTYPE, IERROR)
INTEGER COUNT, ARRAY_OF_BLOCKLENGTHS(*), ARRAY_OF_DISPLACEMENTS(*),
ARRAY_OF_TYPES(*), NEWTYPE, IERROR

ҕඔඪૼ

IN COUNT, ॶ֥۱ඔ.

IN ARRAY_OF_BLOCKLENGTHS, ૄॶӉ؇ඔቆ.

IN ARRAY_OF_DISPLACEMENTS, Ⴈሳࢫඔ‫ק‬ၬ֥ૄॶ֥ఏ൓໊၍ਈඔቆ.

IN ARRAY_OF_TYPES, ჰ൓ඔऌো྘ඔቆ.

OUT NEWTYPE, ྍ‫ܒ‬ᄯ֥ඔऌো྘.

ᄝ෮Ⴕ MPI ֥‫ܒ‬ᄯඔऌো྘ᇏ, MPI_TYPE_STRUCT ൞൐Ⴈቋܼ֥ٗ၂۱‫ݦ‬ඔ, ᆞಒ


൐ႨՎ‫ݦ‬ඔᄝൌ࠽ႋႨᇏ൞٤ӈᇗေ֥. ֞ଢభູՎ, ෮Ⴕ‫ܒ‬ᄯඔऌো྘֥‫ݦ‬ඔ‫ࣜၘ׻‬
ࢺകਔ, ֌൞ေ൐ྍ‫ܒ‬ᄯ֥ඔऌো྘ᆇᆞି‫ܔ‬൐Ⴈ, ߎླေႵၛ༯֥၂ུ‫ݦ‬ඔ஥‫ކ‬Ҍྛ,
ၹՎܱႿೂ‫ޅ‬൐Ⴈᆃུඔऌো྘‫ܒ‬ᄯ‫ݦ‬ඔ֥২ሰࡼᄝః෱၂ུႵܱ֥‫ݦ‬ඔࢺകປᆭު۳
ԛ.

MPI TYPE COMMIT


C int MPI_Type_commit( MPI_Datatype *datatype )
F MPI_TYPE_COMMIT( DATATYPE, IERROR )
INTEGER DATATYPE, IERROR

ҕඔඪૼ

INOUT DATATYPE, ሙСิࢌ֥ඔऌো྘.

ᄝ൐Ⴈሱ‫ק‬ၬ֥ MPI ඔऌো྘ᆭభ, сྶ‫ט‬Ⴈ MPI_TYPE_COMMIT.

MPI TYPE FREE


C int MPI_Type_free( MPI_Datatype *datatype )
F MPI_TYPE_FREE( DATATYPE, IERROR )
INTEGER DATATYPE, IERROR
§9.1 Ⴈ޼‫ק‬ၬ֥ඔऌো྘ 91

ҕඔඪૼ

INOUT DATATYPE, ൤٢҂Ⴈ֥ඔऌো྘.

MPI TYPE EXTENT


C int MPI_Type_extent(MPI_Datatype datatype, MPI_Aint *extent)
F MPI_TYPE_EXTENT( DATATYPE, EXTENT, IERROR )
INTEGER DATATYPE, EXTENT, IERROR

ҕඔඪૼ

IN DATATYPE, ඔऌো྘.

OUT EXTENT, ඔऌো྘ຉᅚު֥ሳࢫඔ.

MPI ADDRESS
C int MPI_Address( void* location, MPI_Aint *address )
F MPI_ADDRESS( LOCATION, ADDRESS, IERROR )
<type> LOCATION(*)
INTEGER ADDRESS, IERROR

ҕඔඪૼ

IN LOCATION, ᄝթԥఖᇏ֥эਈіൕ.

OUT ADDRESS, эਈᄝթԥఖᇏֹ֥ᆶ.

ູਔඪૼೂ‫ܒޅ‬ᄯඔऌো྘‫ ބ‬MPI_TYPE_EXTENT ‫ݦ‬ඔ֥‫ݣ‬ၬၛࠣ MPI_ADDRESS ֥


൐Ⴈ, ໡ૌ۳ԛ၂۱ऎุ֥২ሰࡆၛࢳ൤.
২ 9.1.1 ࡌഡᄝ C ე࿽ᇏ‫ק‬ၬਔ၂۱ࢲ‫ܒ‬, ఃᇏЇও၂۱චࣚ؇ඔ‫ބ‬၂۱ሳ‫ژ‬, ໡ૌေ
‫ק‬ၬᆃဢࢲ‫ ֥ܒ‬MPI ඔऌো྘.
#include <stdio.h> #include "mpi.h" typedef struct {
double value; char str; } data;

void main(argc, argv) int argc; char **argv; {


int p, myid, lens[3]={1, 1, 1}, i;
MPI_Comm mycomm; data tst[3];
MPI_Datatype new, type[3] = {MPI_DOUBLE, MPI_CHAR, MPI_UB};
MPI_Aint disp[3], size; MPI_Status status;

MPI_Init( &argc, &argv );


92 ֻࣴᅣ MPI Ⴈ޼ሱ‫ק‬ၬ֥ඔऌো྘აյЇ

MPI_Comm_dup( MPI_COMM_WORLD, &mycomm);


MPI_Comm_rank( mycomm, &myid); MPI_Comm_size( mycomm, &p);

if (myid == 0)
for(i=0; i<3; i++) { tst[i].value = 1.0; tst[i].str=’a’; }
printf("\nThe Process %1d of %1d is running.\n", myid, p);
MPI_Address(&tst[0], &disp[0]); MPI_Address(&tst[0].str, &disp[1]);
for (i=1; i>=0; i--) disp[i] -= disp[0];
MPI_Type_struct(3, lens, disp, type, &new);
MPI_Type_commit(&new);
MPI_Type_extent(new, &size);

if(myid == 0) printf("\nThe Extent of Data Type is %d.\n", size);


if(myid == 0) MPI_Ssend(tst, 3, new, 1, 1, mycomm);
else if (myid == 1) MPI_Recv(tst, 3, new, 0, 1, mycomm, &status);
MPI_Type_free(&new);
if(myid == 1)
printf("\\nThe values are \%f and \%c\n", tst[1].value, tst[1].str);
MPI_Comm_free(&mycomm);
MPI_Finalize();
}
ᄝᆃ۱ C ӱ྽ᇏ, ໡ૌ‫ק‬ၬਔ၂۱ྍ֥ MPI ඔऌো྘, ‫ߎ౏ط‬൐Ⴈ෱ࣉྛཨ༏
Ԯ‫־‬. ᆃ৚໡ૌ൐Ⴈਔ MPI ᇏิ‫֥܂‬ເඔऌো྘ (pseudo datatype) MPI_UB, ᄝ MPI
ᇏߎႵ၂۱ເඔऌো྘ MPI_LB. ᆃဢ‫ק‬ၬ֥ MPI ֥ྍඔऌো྘ +new+ ᄝ‫ט‬Ⴈ‫ݦ‬ඔ
MPI_TYPE_EXTENT ᆭުْ߭ᆴაࠏఖܱႿචࣚ؇ඔ൞ο 4 ໊ߎ൞ 8 ໊ؓఊႵܱ, ೂ‫ݔ‬൞
ο 4 ໊ؓఊ, ْ߭ᆴູ 12, ‫ڎ‬ᄵູ 16. ֌൞ೂ‫ݔ‬໡ૌ൐Ⴈ༯૫֥‫ݦ‬ඔ MPI_TYPE_SIZE,
෱ْ֥߭ᆴ൞ 9.

MPI TYPE SIZE


C int MPI_Type_size( MPI_Datatype datatype, int *size )
Fortran MPI_TYPE_SIZE( DATATYPE, SIZE, IERROR )
INTEGER DATATYPE, SIZE, IERROR

ҕඔඪૼ

IN DATATYPE, ඔऌো྘.

OUT SIZE, ඔऌো྘֥ሳࢫඔ.


§9.2 MPI ֥ඔऌյЇაҷЇ 93

MPI GET ELEMENTS


C int MPI_Get_elements(MPI_Status *status,MPI_Datatype datatype,int *count)
F MPI_GET_ELEMENTS( STATUS, DATATYPE, COUNT, IERROR )
INTEGER STATUS(MPI_STATUS_SIZE), DATATYPE, COUNT, IERROR

ҕඔඪૼ

IN STATUS, ࢤ൬ཨ༏֥ሑ෿.

IN DATATYPE, ඔऌো྘.

OUT COUNT, MPI ࠎЧඔऌো྘֥۱ඔ.

‫ݦھ‬ඔ‫ ބ‬MPI_GET_COUNT ֥‫ݣ‬ၩ൞҂๝֥, MPI_GET_COUNT ൞ࢤ൬֥֞ඔऌো྘۱


ඔ, ‫ط‬ᆃ৚۳ԛ֥ MPI_GET_ELEMENTS ֤֥֞൞ MPI ࠎЧඔऌো྘֥۱ඔ. ೂ‫ݔ‬ᆃ৚֥
ඔऌো྘൞ MPI ࠎЧඔऌো྘, ೂ C ე࿽ᇏ֥ MPI_INT (Fortran ᇏ MPI_INTEGER) ֩,
ᄵ MPI_GET_COUNT ‫ ބ‬MPI_GET_ELEMENTS ֩ࡎ. ໡ૌ൐Ⴈ༯૫֥၂‫؍‬ӱ྽টඪૼ෱ૌ֥
ҵљ.
......
call mpi_type_contiguous(2, mpi_integer, type, ierr)
call mpi_type_commit(type, ierr)
if(myid .eq. 0 .and. p .gt. 1) then
call mpi_send(ia, 3, mpi_integer, 1, 1, mycomm, ierr)
elseif(myid .eq. 1) then
call mpi_recv(ia, 2, type, 0, 1, mycomm, status, ierr)
call mpi_get_count(status, type, count1, ierr)
call mpi_get_elements(status, type, count2, ierr)
endif
......
၂Ϯটඪ, ᄝ໡ૌሱ࠭ཿ֥ӱ྽ᇏ‫ޓ‬ഒ߶ԛགྷ‫ؿ‬ෂაࢤ൬ൈඔऌো྘൞҂๝֥, ၹ
Վᄝն҆‫ٳ‬ൌ࠽ႋႨᇏ, ᆺླ߶൐Ⴈ MPI_GET_COUNT ࣼ҂߶მ֞಩‫ޅ‬঒଴. ᄝᆃ၂ࢫᇏ,
໡ૌၘࣜࢺകਔೂ‫ܒޅ‬ᄯሱ‫ק‬ၬ֥ MPI ඔऌো྘, ๙ӈᄝ‫ק‬ၬᆃུඔऌো྘ൈ൐Ⴈ֥൞
ཌྷ໊ؓᇂ၍‫׮‬ਈ, ೂ‫ݔ‬൐Ⴈधֹؓᆶট‫ܒ‬ᄯྍ֥ MPI ඔऌো྘, ᄝ൐Ⴈᆃ۱ྍ֥ඔऌো
྘ࣉྛཨ༏Ԯ‫־‬ൈ, MPI ‫ק‬ၬਔ၂۱ӫᆭູ MPI_BOTTOM ֥ཨ༏ߏԊ౵ӈඔ, ၛ‫ ܂‬MPI
֥‫ؿ‬ෂაࢤ൬‫ݦ‬ඔ൐Ⴈ, ऎุ֥൐Ⴈٚൔࡼᄝၛު֥২ሰᇏ۳ԛ.

§9.2 MPI ֥ඔऌյЇაҷЇ

ᆃ৚֥ඔऌյЇაҷЇ‫ ބ‬PVM (Parallel Virtual Machine) Ⴕཌྷ๝֥ྟᇉ, ᄝ MPI


֥धն‫؟‬ඔႋႨᇏ൐ႨႨ޼ሱ‫ק‬ၬ֥ MPI ඔऌো྘ࣼॖၛປӮྸ‫؟‬ඔऌ၂ఏ‫ؿ‬ෂაࢤ
94 ֻࣴᅣ MPI Ⴈ޼ሱ‫ק‬ၬ֥ඔऌো྘აյЇ

൬֥ଢ֥. ֌൞ؓႿ‫گ‬ᄖ֥౦ঃ൐ႨඔऌյЇॖି߶൬֞‫ݺ‬ԩ.

MPI PACK
C int MPI_Pack(void* inbuf, int incount, MPI_Datatype datatype,
void* outbuf,int outsize,int *position,MPI_Comm comm)
F MPI_PACK(INBUF, INCOUNT, DATATYPE, OUTBUF, OUTSIZE, POSITION,
COMM, IERROR )
<type> INBUF(*), OUTBUF(*)
INTEGER INCOUNT, DATATYPE, OUTSIZE, POSITION, COMM, IERROR

ҕඔඪૼ

IN INBUF, ሙСյᄝЇᇏ֥ൻೆߏԊ౵.

IN INCOUNT, ൻೆჭ෍֥۱ඔ.

IN DATATYPE, ඔऌো྘.

OUT OUTBUF, յЇߏԊ౵.

IN OUTSIZE, Ⴈሳࢫඔ‫ק‬ၬ֥յЇߏԊ౵֥նཬ.

INOUT POSITION, յЇߏԊ౵֥֒భ໊ᇂ.

IN COMM, յЇཨ༏֥๙ྐሰ.

MPI UNPACK
C int MPI_Unpack(void* inbuf,int insize,int *position,void* outbuf,
int outcount, MPI_Datatype datatype, MPI_Comm comm)
F MPI_UNPACK( INBUF, INSIZE, POSITION, OUTBUF, OUTCOUNT, DATATYPE,
COMM, IERROR )
<type> INBUF(*), OUTBUF(*)
INTEGER INSIZE, POSITION, OUTCOUNT, DATATYPE, COMM, IERROR

ҕඔඪૼ

IN INBUF, ҷЇߏԊ౵.

IN INSIZE, Ⴈሳࢫඔ‫ק‬ၬ֥ҷЇߏԊ౵֥նཬ.

INOUT POSITION, յЇߏԊ౵֥֒భ໊ᇂ.

OUT OUTBUF, ൻԛඔऌߏԊ౵.

IN OUTCOUNT, ൻԛඔऌߏԊ౵ჭ෍֥۱ඔ.

IN DATATYPE, ඔऌো྘.

IN COMM, ๙ྐሰ.
§9.2 MPI ֥ඔऌյЇაҷЇ 95

ҐႨᆃᇕյЇٚൔࣉྛཨ༏Ԯ‫־‬ൈ, ඔऌো྘၂‫ק‬ေ൐Ⴈ MPI_PACKED. ູਔି‫ܔ‬ᆩ


֡၂ቆඔऌᄝյЇൈླေ‫؟‬ն֥ߏԊ౵, MPI ิ‫܂‬ਔೂ༯֥‫ݦ‬ඔ:

MPI PACK SIZE


C int MPI_Pack_size( int incount, MPI_Datatype datatype,
MPI_Comm comm, int *size )
F MPI_PACK_SIZE( INCOUNT, DATATYPE, COMM, SIZE, IERROR )
INTEGER INCOUNT, DATATYPE, COMM, SIZE, IERROR

ҕඔඪૼ

IN INCOUNT, ሙСյЇ֥ჭ෍۱ඔ.

IN DATATYPE, ඔऌো྘.

IN COMM, ๙ྐሰ.

OUT SIZE, οሳࢫඔ‫ק‬ၬ֥յЇླေ֥ߏԊ౵նཬ.

Վ‫ݦ‬ඔْ֥߭ᆴ SIZE ေбჰ൓ඔऌЧദ෮ᅝႵ֥ሳࢫඔေն, ᆃ൞ၹູᄝЇᇏߎ


Ⴕ၂ུః෱֥ྐ༏. ၛ༯໡ૌ۳ԛ൐Ⴈ MPI_PACK ‫ ބ‬MPI_UNPACK ֥၂۱২ሰ, টࢲඏܱ
ႿႨ޼ሱ‫ק‬ၬ֥ඔऌো྘҆‫ٳ‬.
২ 9.2.1 ࡌഡ໡ૌေϜ၂۱ᆜඔඔቆ‫ބ‬၂۱චࣚ؇ඔቆՖֻ 0 ۱ࣉӱԮෂֻ֞ 1 ۱ࣉ
ӱ, ࣐ܵ໡ૌॖၛ൐ႨႨ޼ሱ‫ק‬ၬඔऌো྘টղ֞၂ՑԮෂ֥ଢ֥, ֌໡ૌ္ॖႨյЇ‫ބ‬
ҷЇ֥ٚൔൌགྷഈඍေ౰. ऎุൌགྷೂ༯:
program pack
include ’mpif.h’
c
integer maxbuf, len
parameter (maxbuf = 200, len = 10)
integer myid, p, mycomm, ierr, status(mpi_status_size, 2),
& ia(len), count1, count2, i, pos
real*8 a(len)
character buf(maxbuf)
c
call mpi_init( ierr )
call mpi_comm_dup( mpi_comm_world, mycomm, ierr)
call mpi_comm_rank( mycomm, myid, ierr )
call mpi_comm_size( mycomm, p, ierr )
print *, ’Process ’, myid, ’ of ’, p, ’ is running’
c
if(myid .eq. 0) then
do 10 i=1, len
96 ֻࣴᅣ MPI Ⴈ޼ሱ‫ק‬ၬ֥ඔऌো྘აյЇ

ia(i) = i
a(i) = dble(i)
10 continue
endif
call mpi_pack_size(len, mpi_integer, mycomm, count1, ierr)
call mpi_pack_size(len, mpi_double_precision, mycomm, count2, i)
print *, ’The pack size of 10 integer and real8 are:’,
& count1, count2
pos = 1
if(myid .eq. 0 .and. p .gt. 1) then
call mpi_pack(ia, len, mpi_integer, buf, maxbuf, pos,
& mycomm, ierr)
call mpi_pack(a, len, mpi_double_precision, buf, maxbuf, pos,
& mycomm, ierr)
call mpi_send(buf, pos-1, mpi_packed, 1, 1, mycomm, ierr)
elseif(myid .eq. 1) then
call mpi_recv(buf, maxbuf, mpi_packed, 0, 1, mycomm,
& status, ierr)
call mpi_unpack(buf, maxbuf, pos, ia, len, mpi_integer,
& mycomm, ierr)
call mpi_unpack(buf, maxbuf, pos, a, len, mpi_double_precision,
& mycomm, ierr)
print *, ’The received values are: ’, a(1), a(2), a(3)
endif
call mpi_comm_free(mycomm, ierr)
call mpi_finalize(ierr)
stop
end
ֻ൅ᅣ MPI ऊ‫ކ‬๙ྐ

A0 P0 A0
P1 Q
Q
A0



P2 A0
P3 A0
๭ 10.1: ܼѬ‫ݦ‬ඔ֥ቔႨ

A0 A1 A2 A 3 P 0 Q
Q
A0


P1 A1
P2 A2
QQ
P3 A3
๭ 10.2: ೛Ѭა൬ࠢ‫ݦ‬ඔ֥ቔႨ

ऊ‫ކ‬๙ྐ (collective communication) ൞ᆷ‫؟‬۱ࣉӱ (๙ӈնႿ 2) ᆭࡗ֥๙ྐ. ᄝ


ᆃ၂ࢫᇏ, ࢺക೘ٚ૫֥ଽಸ, ᅰθ๝҄ (barrier synchronization)aಆअ๙ྐ‫ݦ‬ඔ (global
communication functions) ‫ބ‬ಆअ݂ჿҠቔ (global reduction operations). ၛഈ֥ 4 ۱๭
Ֆྙൔഈ۳ԛਔᆃࠫᇕऊ‫ކ‬๙࿟෮іղ֥ଽಸ.

§10.1 ᅰθ๝҄
MPI BARRIER
C int MPI_Barrier( MPI_Comm comm )
F MPI_BARRIER( COMM, IERROR )
INTEGER COMM, IERROR

97
98 ֻ൅ᅣ MPI ऊ‫ކ‬๙ྐ

A0 A1 A2 A3 P0 A0
A0 A1 A2 A3 P1 A1
QQ
A0 A1 A2 A3 P2 A2
A0 A1 A2 A3 P3 A3
๭ 10.3: ૄ۱ࣉӱ‫׻‬൬ࠢ‫ݦ‬ඔ֥ቔႨ

A0 A1 A2 A3 P0 A0 B0 C0 D0
B0 B1 B2 B3 P1 A1 B1 C1 D1
QQ
C0 C1 C2 C3 P2 A2 B2 C2 D2
D0 D1 D2 D3 P3 A3 B3 C3 D3
๭ 10.4: ಆࢌߐ‫ݦ‬ඔ֥ቔႨ
§10.2 ֆׄა‫ׄ؟‬๙ྐ‫ݦ‬ඔ 99

ҕඔඪૼ

IN COMM, ๙ྐሰ.

ᆃ൞ MPI ิ‫ື֥܂‬၂֥၂۱๝҄‫ݦ‬ඔ, ֒ COMM ᇏ֥෮Ⴕࣉӱ‫׻‬ᆳྛᆃ۱‫ݦ‬ඔൈҌ


ْ߭, ೂ‫ݔ‬Ⴕ၂۱ࣉӱીႵᆳྛՎ‫ݦ‬ඔ, ఃჅࣉӱࡼԩႿ֩րሑ෿. ᄝᆳྛປᆃ۱‫ݦ‬ඔᆭ
ު, ෮Ⴕࣉӱࡼ๝ൈᆳྛఃު֥಩ༀ.

§10.2 ֆׄა‫ׄ؟‬๙ྐ‫ݦ‬ඔ
MPI BCAST
C int MPI_Bcast( void* buffer, int count, MPI_Datatype datatype,
int root, MPI_Comm comm )
F MPI_BCAST( BUFFER, COUNT, DATATYPE, ROOT, COMM, IERROR )
<type> BUFFER(*)
INTEGER COUNT, DATATYPE, ROOT, COMM, IERROR

ҕඔඪૼ

INOUT BUFFER, ߏԊ౵֥൮ֹᆶ.

IN COUNT, ߏԊ౵ᇏჭ෍֥۱ඔ.

IN DATATYPE, ߏԊ౵֥ඔऌো྘.

IN ROOT, ၛ෱ູჷࣉྛܼѬ֥ࣉӱщ‫ݼ‬.

IN COMM, ๙ྐሰ.

൐ႨՎ‫ݦ‬ඔൈсྶᇿၩᄝ COMM ᇏ֥෮Ⴕࣉӱ‫׻‬ᆳྛՎ‫ݦ‬ඔ, ೂ‫ࣉݔ‬ӱщ‫ ݼ‬ROOT, ᄵ


іൕϜՎࣉӱᇏ֥ BUFFER ֥ଽಸܼѬ֞ COMM ෮Ⴕః෱֥ࣉӱᇏ. Վ‫ݦ‬ඔ൞ѩྛӱ྽
ᇏࣜӈԛགྷ֥, ၹՎ൞۱сྶ‫ݺޓ‬ᅧ໤֥ MPI ๙ྐ‫ݦ‬ඔ.

MPI GATHER
C int MPI_Gather( void* sendbuf, int sendcount, MPI_Datatype sendtype,
void* recvbuf, int recvcount, MPI_Datatype recvtype,
int root, MPI_Comm comm )
F MPI_GATHER( SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,
RECVTYPE, ROOT, COMM, IERROR )
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR
100 ֻ൅ᅣ MPI ऊ‫ކ‬๙ྐ

ҕඔඪૼ

IN SENDBUF, ‫ؿ‬ෂߏԊ౵֥൮ֹᆶ.

IN SENDCOUNT, ေ‫ؿ‬ෂ֥ჭ෍֥۱ඔ.

IN SENDTYPE, ‫ؿ‬ෂߏԊ౵֥ඔऌো྘.

OUT RECVBUF, ࢤ൬ߏԊ౵֥൮ֹᆶ.

IN RECVCOUNT, ࢤ൬ૄ۱ࣉӱᇏඔऌჭ෍֥۱ඔ.

IN RECVTYPE, ࢤ൬ߏԊ౵֥ඔऌো྘.

IN ROOT, ࢤ൬ࣉӱ֥щ‫ݼ‬.

IN COMM, ๙ྐሰ.

ᆃ൞ MPI ิ‫֥܂‬ऊࠢ (gather) ‫ݦ‬ඔ, ఃቔႨ൞Ϝ COMM ᇏ෮Ⴕࣉӱ (Їও ROOT) ֥


ඔऌऊࠢ֞ ROOT ࣉӱᇏ, ѩ౏ሱ‫׮‬οࣉӱщ‫ݼ‬ඨ྽թ٢ᄝࢤ൬ߏԊ౵ RECVBUF ᇏ. ؓ
Ⴟ٤ ROOT ࣉӱ, ޭ੻ࢤ൬ߏԊ౵ RECVBUF.
MPI GATHERV
C int MPI_Gatherv(void* sendbuf, int sendcount, MPI_Datatype sendtype,
void* recvbuf, int *recvcounts, int *displs,
MPI_Datatype recvtype, int root, MPI_Comm comm )
F MPI_GATHERV( SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS,
DISPLS, RECVTYPE, ROOT, COMM, IERROR )
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNT, SENDTYPE, RECVCOUNTS(*), DISPLS(*), RECVTYPE,
ROOT, COMM, IERROR

ҕඔඪૼ

IN SENDBUF, ‫ؿ‬ෂߏԊ౵֥൮ֹᆶ.

IN SENDCOUNT, ေ‫ؿ‬ෂ֥ჭ෍֥۱ඔ.

IN SENDTYPE, ‫ؿ‬ෂߏԊ౵֥ඔऌো྘.

OUT RECVBUF, ࢤ൬ߏԊ౵֥൮ֹᆶ.

IN RECVCOUNTS, ࢤ൬ૄ۱ࣉӱඔऌჭ෍֥۱ඔᆜඔඔቆ.

IN DISPLS, ࢤ൬ඔऌթ٢໊֥ᇂඔቆ.

IN RECVTYPE, ࢤ൬ߏԊ౵֥ඔऌো྘.

IN ROOT, ࢤ൬ࣉӱ֥щ‫ݼ‬.

IN COMM, ๙ྐሰ.

ᆃ۱‫ݦ‬ඔ൞ MPI_GATHER ֥ঔԉ, ෱ᄍྸՖ҂๝֥ࣉӱᇏࢤ൬҂๝Ӊ؇֥ཨ༏, ‫౏ط‬


ࢤ൬֥֞ཨ༏ॖၛթ٢ᄝࢤ൬ߏԊ౵֥҂๝໊ᇂ, ၹՎ൐Ⴈေб MPI_GATHER ۷ਲࠃ. ༯
૫໡ૌ۳ԛ၂۱২ሰটඪૼೂ‫ޅ‬൐Ⴈ MPI ֥ऊࠢ‫ݦ‬ඔ:
§10.2 ֆׄა‫ׄ؟‬๙ྐ‫ݦ‬ඔ 101

২ 10.2.1 ࡌഡᄝૄ۱ࣉӱഈ‫׻‬Ⴕ၂ቆඔऌ, གྷေࡼ෱ૌ൬ࠢ֞ࣉӱщ‫ ູݼ‬ROOT ֥ࣉ


ӱᇏ, ѩοࣉӱщ‫֥ݼ‬ඨ྽թ٢, ᄵႵೂ༯֥ӱ྽ൌགྷՎ‫ିۿ‬.
program gather
include ’mpif.h’
c
integer maxbuf, len, mp
parameter (maxbuf = 200, len = 10, mp = 5)
integer myid, p, mycomm, ierr, root, ia(len), iga(maxbuf), i,
& displs(mp), counts(mp)
c
call mpi_init( ierr )
call mpi_comm_dup( mpi_comm_world, mycomm, ierr)
call mpi_comm_rank( mycomm, myid, ierr )
call mpi_comm_size( mycomm, p, ierr )
print *, ’Process ’, myid, ’ of ’, p, ’ is running’
c
do 10 i=1, len
ia(i) = i+myid*len
10 continue c
do 20 i=1, p
displs(i) = 20*i-20
counts(i) = len
20 continue
root = 0
c
call mpi_gather(ia, len, mpi_integer, iga, len, mpi_integer,
& root, mycomm, ierr)
c
if(myid .eq. root) then
print *, ’The gather values are: ’,
& iga(1), iga(len+1), iga(2*len+1)
endif
c
call mpi_gatherv(ia, len, mpi_integer, iga, counts, displs,
& mpi_integer, root, mycomm, ierr)
c
if(myid .eq. root) then
print *, ’The gatherv values are: ’,
& iga(2), iga(2*len+2), iga(4*len+2)
endif
c
call mpi_comm_free(mycomm, ierr)
call mpi_finalize(ierr)
102 ֻ൅ᅣ MPI ऊ‫ކ‬๙ྐ

stop
end
ᆃ۱ӱ྽֥ൻԛᆴႋ‫ٳ‬љູ: 1, 11, 21 ‫ ބ‬2, 12, 22. MPI_GATHER ࢤ൬֥֞ඔऌᄝࢤ
൬ߏԊ౵ᇏ൞৵࿃թ٢֥, ‫ ط‬MPI_GATHERV ࢤ൬֥֞ඔऌᄝࢤ൬ߏԊ౵ᇏ൞҂৵࿃թ٢
֥, ᄝ໡ૌᆃ৚۳ԛ֥২ሰᇏ, ႮႿ COUNTS ֥෮Ⴕ‫ٳ‬ਈ൞ཌྷ๝֥, ॖၛुӮ൞ૄ‫҄ۯ‬Ӊ
ູ 20 ໊֥ᇂթ٢၂۱ྍࢤ൬֥ඔऌ.

MPI SCATTER
C int MPI_Scatter( void* sendbuf, int sendcount, MPI_Datatype sendtype,
void* recvbuf, int recvcount, MPI_Datatype recvtype,
int root, MPI_Comm comm )
F MPI_SCATTER( SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,
RECVTYPE, ROOT, COMM, IERROR )
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR

ҕඔඪૼ

IN SENDBUF, ‫ؿ‬ෂߏԊ౵֥൮ֹᆶ.

IN SENDCOUNT, ‫ؿ‬ෂ֞ૄ۱ࣉӱᇏ֥ჭ෍֥۱ඔ.

IN SENDTYPE, ‫ؿ‬ෂߏԊ౵֥ඔऌো྘.

OUT RECVBUF, ࢤ൬ߏԊ౵֥൮ֹᆶ.

IN RECVCOUNT, ࢤ൬ඔऌჭ෍֥۱ඔ.

IN RECVTYPE, ࢤ൬ߏԊ౵֥ඔऌো྘.

IN ROOT, ‫ؿ‬ෂࣉӱ֥щ‫ݼ‬.

IN COMM, ๙ྐሰ.

ᆃ൞ MPI ิ‫֥܂‬೛҃ (scatter) ‫ݦ‬ඔ, Վ‫ݦ‬ඔ൞ MPI_GATHER ֥୉Ҡቔ.

MPI SCATTERV
C int MPI_Scatterv(void* sendbuf, int *sendcounts, int *displs,
MPI_Datatype sendtype, void* recvbuf, int recvcount,
MPI_Datatype recvtype, int root, MPI_Comm comm )
F MPI_SCATTERV( SENDBUF, SENDCOUNTS, DISPLS, SENDTYPE, RECVBUF, RECVCOUNT,
RECVTYPE, ROOT, COMM, IERROR )
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNTS(*), DISPLS(*), SENDTYPE, RECVCOUNT, RECVTYPE, ROOT,
COMM, IERROR
§10.3 ‫ׄ؟‬ა‫ׄ؟‬๙ྐ‫ݦ‬ඔ 103

ҕඔඪૼ

IN SENDBUF, ‫ؿ‬ෂߏԊ౵֥൮ֹᆶ.

IN SENDCOUNTS, ‫ؿ‬ෂ֞ૄ۱ࣉӱᇏ֥ჭ෍֥۱ඔඔቆ.

IN DISPLS, ‫ؿ‬ෂ֞ૄ۱ࣉӱᇏ֥ඔऌఏ൓໊၍.

IN SENDTYPE, ‫ؿ‬ෂߏԊ౵֥ඔऌো྘.

OUT RECVBUF, ࢤ൬ߏԊ౵֥൮ֹᆶ.

IN RECVCOUNT, ࢤ൬ඔऌჭ෍֥۱ඔ.

IN RECVTYPE, ࢤ൬ߏԊ౵֥ඔऌো྘.

IN ROOT, ‫ؿ‬ෂࣉӱ֥щ‫ݼ‬.

IN COMM, ๙ྐሰ.

§10.3 ‫ׄ؟‬ა‫ׄ؟‬๙ྐ‫ݦ‬ඔ
MPI ALLGATHER
C int MPI_Allgather( void* sendbuf, int sendcount, MPI_Datatype sendtype,
void* recvbuf, int recvcount, MPI_Datatype recvtype,
MPI_Comm comm )
F MPI_ALLGATHER( SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,
RECVTYPE, COMM, IERROR )
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, COMM, IERROR

ҕඔඪૼ

IN SENDBUF, ‫ؿ‬ෂߏԊ౵֥൮ֹᆶ.

IN SENDCOUNT, ေ‫ؿ‬ෂ֥ჭ෍֥۱ඔ.

IN SENDTYPE, ‫ؿ‬ෂߏԊ౵֥ඔऌো྘.

OUT RECVBUF, ࢤ൬ߏԊ౵֥൮ֹᆶ.

IN RECVCOUNT, ࢤ൬ૄ۱ࣉӱᇏඔऌჭ෍֥۱ඔ.

IN RECVTYPE, ࢤ൬ߏԊ౵֥ඔऌো྘.

IN COMM, ๙ྐሰ.
104 ֻ൅ᅣ MPI ऊ‫ކ‬๙ྐ

MPI ALLGATHERV
C int MPI_Allgatherv( void* sendbuf, int sendcount, MPI_Datatype sendtype,
void* recvbuf, int recvcount, MPI_Datatype recvtype,
MPI_Comm comm )
F MPI_ALLGATHERV( SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,
RECVTYPE, COMM, IERROR )
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, COMM, IERROR

ҕඔඪૼ

IN SENDBUF, ‫ؿ‬ෂߏԊ౵֥൮ֹᆶ.

IN SENDCOUNT, ေ‫ؿ‬ෂ֥ჭ෍֥۱ඔ.

IN SENDTYPE, ‫ؿ‬ෂߏԊ౵֥ඔऌো྘.

OUT RECVBUF, ࢤ൬ߏԊ౵֥൮ֹᆶ.

IN RECVCOUNT, ࢤ൬ૄ۱ࣉӱᇏඔऌჭ෍֥۱ඔ.

IN RECVTYPE, ࢤ൬ߏԊ౵֥ඔऌো྘.

IN COMM, ๙ྐሰ.

Վ‫ݦؽ‬ඔ൞ૄ۱ࣉӱ‫ྛࣉ׻‬ඔऌऊࠢҠቔ, ‫ ط‬MPI_GATHER ‫ ބ‬MPI_GATHERV ᆺ൞ః


ᇏ֥၂۱ࣉӱࣉྛඔऌ֥ऊࠢ. ᆃ৚ૄ۱ࣉӱ‫ؿ׻‬ෂཨ༏္‫ࢤ׻‬൬ཨ༏.

MPI ALLTOALL
C int MPI_Alltoall( void* sendbuf, int sendcount, MPI_Datatype sendtype,
void* recvbuf, int recvcount, MPI_Datatype recvtype,
MPI_Comm comm )
F MPI_ALLTOALL( SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,
RECVTYPE, COMM, IERROR )
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, COMM, IERROR
§10.3 ‫ׄ؟‬ა‫ׄ؟‬๙ྐ‫ݦ‬ඔ 105

ҕඔඪૼ

IN SENDBUF, ‫ؿ‬ෂߏԊ౵֥൮ֹᆶ.

IN SENDCOUNT, ေ‫ؿ‬ෂ֥ჭ෍֥۱ඔ.

IN SENDTYPE, ‫ؿ‬ෂߏԊ౵֥ඔऌো྘.

OUT RECVBUF, ࢤ൬ߏԊ౵֥൮ֹᆶ.

IN RECVCOUNT, ࢤ൬ૄ۱ࣉӱᇏඔऌჭ෍֥۱ඔ.

IN RECVTYPE, ࢤ൬ߏԊ౵֥ඔऌো྘.

IN COMM, ๙ྐሰ.

MPI ALLTOALLV
C int MPI_Alltoallv(void* sendbuf, int *sendcounts, int *sdispls,
MPI_Datatype sendtype, void* recvbuf, int *recvcounts,
int *rdispls, MPI_Datatype recvtype, MPI_Comm comm )
F MPI_ALLTOALLV( SENDBUF, SENDCOUNTS, SDISPLS, SENDTYPE, RECVBUF,
RECVCOUNTS, RDISPLS, RECVTYPE, COMM, IERROR )
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNTS(*), SDISPLS(*), SENDTYPE, RECVCOUNTS(*), RDISPLS(*),
RECVTYPE, COMM, IERROR

ҕඔඪૼ

IN SENDBUF, ‫ؿ‬ෂߏԊ౵֥൮ֹᆶ.

IN SENDCOUNTS, ‫ؿ‬ෂ֞ૄ۱ࣉӱᇏ֥ჭ෍֥۱ඔඔቆ.

IN SDISPLS, ‫ؿ‬ෂ֞ૄ۱ࣉӱᇏ֥ඔऌఏ൓໊၍.

IN SENDTYPE, ‫ؿ‬ෂߏԊ౵֥ඔऌো྘.

OUT RECVBUF, ࢤ൬ߏԊ౵֥൮ֹᆶ.

IN RECVCOUNTS, ࢤ൬ඔऌჭ෍֥۱ඔඔቆ.

IN RDISPLS, ࢤ൬ࣉӱᇏթ٢ඔऌ֥ఏ൓໊၍.

IN RECVTYPE, ࢤ൬ߏԊ౵֥ඔऌো྘.

IN COMM, ๙ྐሰ.

ᆃ‫ؽ‬۱‫ݦ‬ඔ֩ࡎႿᄝ෮Ⴕࣉӱᇏ֥ඔऌࣉྛ೛҃. ູਔьႿ৘ࢳ‫ބ‬ᆞಒ൐ႨՎ‫ݦ‬ඔ,
໡ૌߎ൞۳ԛ၂۱ऎุ২ሰ.
program allall
include ’mpif.h’
integer maxbuf, len, mp
parameter (maxbuf = 200, len = 10, mp = 5)
106 ֻ൅ᅣ MPI ऊ‫ކ‬๙ྐ

integer myid, p, mycomm, ierr, igb(maxbuf), iga(maxbuf), i,


& sdispls(mp), scounts(mp), rdispls(mp), rcounts(mp)
call mpi_init( ierr )
call mpi_comm_dup( mpi_comm_world, mycomm, ierr)
call mpi_comm_rank( mycomm, myid, ierr )
call mpi_comm_size( mycomm, p, ierr )
print *, ’Process ’, myid, ’ of ’, p, ’ is running’
do 10 i=1, maxbuf
iga(i) = i+maxbuf*myid
10 continue
do 20 i=1, p
sdispls(i) = 20*i-20
rdispls(i) = 15*i-15
scounts(i) = len
rcounts(i) = len
20 continue
call mpi_alltoall(iga, len, mpi_integer, igb, len, mpi_integer,
& mycomm, ierr)
print *, ’The alltoall values are: ’,
& igb(1), igb(len+1), igb(2*len+1), ’ on Proc. ’, myid
call mpi_alltoallv(iga, scounts, sdispls, mpi_integer, igb,
& rcounts, rdispls, mpi_integer, mycomm, ierr)
print *, ’The alltoallv values are: ’,
& igb(1), igb(16), igb(31), ’ on Proc. ’, myid
call mpi_comm_free(mycomm, ierr)
call mpi_finalize(ierr)
stop
end
ֻ൅၂ᅣ MPI ಆअ݂ჿҠቔ

A0 A1 A2 P0 A0 + B0 + C0 A1 + B1 + C1 A2 + B2 + C2

Q
B0 B1 B2 P1 Q



C0 C1 C2 P2
๭ 11.1: ၂۱ࣉӱࣉྛ݂ჿҠቔ

A0 A1 A2 P0 A0 + B0 + C0 A1 + B1 + C1 A2 + B2 + C2

Q
B0 B1 B2 P1 Q


A0 + B0 + C0 A1 + B1 + C1 A2 + B2 + C2

C0 C1 C2 P2 A0 + B0 + C0 A1 + B1 + C1 A2 + B2 + C2

๭ 11.2: ෮Ⴕࣉӱࣉྛ݂ჿҠቔ

A0 A1 A2 P0 A0 + B0 + C0

Q
B0 B1 B2 P1 Q


A1 + B1 + C1

C0 C1 C2 P2 A2 + B2 + C2

๭ 11.3: ࣉྛ݂ჿ‫ؿٳ‬Ҡቔ

ഈඍ 4 ۱๭൞݂ؓჿҠቔ֥၂ྙൔ૭ඍ.

MPI REDUCE
C int MPI_Reduce(void* sendbuf, void* recvbuf, int count,
MPI_Datatype datatype,MPI_Op op,int root,MPI_Comm comm)
F MPI_REDUCE( SENDBUF, RECVBUF, COUNT, DATATYPE, OP, ROOT, COMM, IERROR )
<type> SENDBUF(*), RECVBUF(*)
INTEGER COUNT, DATATYPE, OP, ROOT, COMM, IERROR

107
108 ֻ൅၂ᅣ MPI ಆअ݂ჿҠቔ

A0 A1 A2 P0 A0 A1 A2

Q
B0 B1 B2 P1 Q


A0 + B0 A1 + B1 A2 + B2

C0 C1 C2 P2 A0 + B0 + C0 A1 + B1 + C1 A2 + B2 + C2

๭ 11.4: భሗ݂ჿҠቔ

ҕඔඪૼ

IN SENDBUF, ‫ؿ‬ෂߏԊ౵֥൮ֹᆶ.

OUT RECVBUF, ࢤ൬ߏԊ౵֥൮ֹᆶ.

IN COUNT, ߏԊ౵ᇏჭ෍֥۱ඔ.

IN DATATYPE, ߏԊ౵֥ඔऌো྘.

IN OP, ‫ޅ‬ᇕ݂ჿҠቔ.

IN ROOT, ࢤ൬ࣉӱщ‫ݼ‬.

IN COMM, ๙ྐሰ.

ᆃ۱‫ݦ‬ඔ൞ο‫ٳ‬ਈࣉྛ݂ჿҠቔ֥, ఃᄎෘႮ OP টಒ‫ק‬, ቋު֥ࢲ‫ݔ‬٢ᄝ ROOT ࣉ


ӱᇏ, ః෱ࣉӱᇏ֥ RECVBUF ҂ఏቔႨ. ᄝ MPI ᇏܿ‫ק‬ਔ၂ུᄍྸ֥Ҡቔೂ༯:

Ҡቔ଀ ၩၬ
MPI_MAX ౰ቋն
MPI_MIN ౰ቋཬ
MPI_SUM ౰‫ބ‬
MPI_PROD ౰ࠒ
MPI_LAND આࠠა
MPI_BAND ο໊ა
MPI_LOR આࠠࠇ
MPI_BOR ο໊ࠇ
MPI_LXOR આࠠაࠇ
MPI_BXOR ο໊აࠇ
MPI_MAXLOC ౰ቋն‫໊ބ‬ᇂ
MPI_MINLOC ౰ቋཬ‫໊ބ‬ᇂ

ᆃུᄎෘ൞Ⴕඔऌো྘ေ౰֥, ൮༵ؓඔऌো྘ࣉྛ‫ٳ‬ো:
109

C integer: MPI_INT, MPI_LONG, MPI_SHORT, MPI_UNSIGNED_SHORT, MPI_UNSIGNED,


MPI_UNSIGNED_LONG
Fortran integer: MPI_INTEGER
Floating point: MPI_DOUBLE, MPI_REAL, MPI_DOUBLE_PRECISION, MPI_LONG_DOUBLE
Logical: MPI_LOGICAL
Complex: MPI_COMPLEX
Byte : MPI_BYTE

གྷᄝؓૄᇕҠቔᄍྸ֥ඔऌো྘ܿ‫ק‬ೂ༯:

OP ᄍྸ֥ඔऌো྘
MPI_MAX, MPI_MIN C integer, Fortran integer, Floating point
MPI_SUM, MPI_PROD C integer, Fortran integer, Floating point, Complex
MPI_LAND, MPI_LOR, MPI_LXOR C integer, Logical
MPI_BAND, MPI_BOR, MPI_BXOR C integer, Fortran integer, Byte

ܱႿ MPI_MAXLOC ‫ ބ‬MPI_MINLOC, MPI ؓ Fortran ӱ྽‫ ބ‬C ӱ྽൐Ⴈ֥‫ކگ‬ඔऌ


ো྘ܿ‫ק‬ೂ༯:

Fortran ӱ྽
‫ކگ‬ඔऌো྘ ো྘૭ඍ
MPI_2REAL pair of REALs
MPI_2DOUBLE_PRECISION pair of DOUBLE PRECISIONs
MPI_2INTEGER pair of INTEGERs

C ӱ྽
‫ކگ‬ඔऌো྘ ো྘૭ඍ
MPI_FLOAT_INT float and int
MPI_DOUBLE_INT double and int
MPI_LONG_INT long and int
MPI_SHORT_INT short and int
MPI_LONG_DOUBLE_INT long double and int
MPI_2INT pair of ints

২ 11.0.1 ࡌഡᄝૄ۱ԩ৘ࠏᇏႵ၂۱ඔ, ໡ૌေᄝᆃུඔᇏᅳ၂۱ቋն֥, ѩಒ‫ק‬ᆃ۱


ቋնඔᄝଧ۱ԩ৘ࠏᇏ, ᄵॖႨೂ༯֥ӱ྽:
program reduce
include ’mpif.h’
110 ֻ൅၂ᅣ MPI ಆअ݂ჿҠቔ

c
integer myid, p, mycomm, ierr, m, n, root, pair(2), answer(2)
c
call mpi_init( ierr )
call mpi_comm_dup( mpi_comm_world, mycomm, ierr)
call mpi_comm_rank( mycomm, myid, ierr )
call mpi_comm_size( mycomm, p, ierr )
print *, ’Process ’, myid, ’ of ’, p, ’ is running’
root = 0
m = myid
call mpi_reduce(m, n, 1, mpi_integer, mpi_max, root, mycomm, ierr)
c
if(myid .eq. root) print *, ’The maxmum value is ’, n
pair(1) = mod(myid + 1, p)
pair(2) = myid
call mpi_reduce(pair, answer, 1, mpi_2integer, mpi_maxloc, root,
& mycomm, ierr)
if(myid .eq. root) print *, ’The maxmum value is ’, answer(1),
& ’ on process ’, answer(2)
c
call mpi_comm_free(mycomm, ierr)
call mpi_finalize(ierr)
stop
end

MPI ALLREDUCE
C int MPI_Allreduce( void* sendbuf, void* recvbuf, int count,
MPI_Datatype datatype, MPI_Op op, MPI_Comm comm )
F MPI_ALLREDUCE( SENDBUF, RECVBUF, COUNT, DATATYPE, OP, COMM, IERROR )
<type> SENDBUF(*), RECVBUF(*)
INTEGER COUNT, DATATYPE, OP, COMM, IERROR

ҕඔඪૼ

IN SENDBUF, ‫ؿ‬ෂߏԊ౵֥൮ֹᆶ.

OUT RECVBUF, ࢤ൬ߏԊ౵֥൮ֹᆶ.

IN COUNT, ߏԊ౵ᇏჭ෍֥۱ඔ.

IN DATATYPE, ߏԊ౵֥ඔऌো྘.

IN OP, ‫ޅ‬ᇕ݂ჿҠቔ.

IN COMM, ๙ྐሰ.

Վ‫ݦ‬ඔ‫ ބ‬MPI_REDUCE ֥ၩන൞ཌྷ๝֥, ᆺ൞ቋުࢲ‫ݔ‬ᄝ෮Ⴕ֥ࣉӱᇏ.


111

MPI REDUCE SCATTER


C int MPI_Reduce_scatter(void* sendbuf, void* recvbuf, int *recvcounts,
MPI_Datatype datatype,MPI_Op op,MPI_Comm comm)
F MPI_REDUCE_SCATTER( SENDBUF, RECVBUF, RECVCOUNTS, DATATYPE, OP, COMM,
IERROR )
<type> SENDBUF(*), RECVBUF(*)
INTEGER RECVCOUNTS(*), DATATYPE, OP, COMM, IERROR

ҕඔඪૼ

IN SENDBUF, ‫ؿ‬ෂߏԊ౵֥൮ֹᆶ.

OUT RECVBUF, ࢤ൬ߏԊ౵֥൮ֹᆶ.

IN RECVCOUNTS, ჭ෍۱ඔ֥ඔቆ.

IN DATATYPE, ߏԊ౵֥ඔऌো྘.

IN OP, ‫ޅ‬ᇕ݂ჿҠቔ.

IN COMM, ๙ྐሰ.

Վ‫ݦ‬ඔཌྷ֒Ⴟ༵ቓ MPI_REDUCE, ಖުᄝቓ MPI_SCATTER.


২ 11.0.2 ഡ໡ૌ൐Ⴈ p ۱ࣉӱ࠹ෘ c = Ab, ఃᇏ A ൞ m ࢨइᆔ, b ൞ m- ົཟਈ. ࡌ
ഡ m = np (ೂ҂ିᆜԢϜഺჅ҆‫ٳ‬٢ᄝቋު၂۱ࣉӱᇏ), ᄝૄ۱ࣉӱᇏթ٢ A ֥ n ਙ
‫ؓބ‬ႋ֥ b ֥ n ۱‫ٳ‬ਈ, གྷေᄝૄ۱ࣉӱᇏ֤֞ა b ؓႋ֥ c ࠇ൞ c ֥ಆ҆, ᄵ໡ૌॖ
ၛႨ༯૫֥ӱ྽ൌགྷ:
program redsct
include ’mpif.h’
c
integer lda, cols, maxnp
parameter (lda = 100, cols = 100, maxnp = 5)
integer myid, p, mycomm, ierr, m, n, counts(maxnp)
real a(lda, cols), b(cols), c(lda), sum(lda)
logical sct
c
call mpi_init( ierr )
call mpi_comm_dup( mpi_comm_world, mycomm, ierr)
call mpi_comm_rank( mycomm, myid, ierr )
call mpi_comm_size( mycomm, p, ierr )
print *, ’Process ’, myid, ’ of ’, p, ’ is running’
if (p .gt. maxnp) goto 999
m = 100
sct = .false.
c sct = .true.
112 ֻ൅၂ᅣ MPI ಆअ݂ჿҠቔ

call initab(m, myid, p, n, a, lda, b, sum)


call locmv(m, n, a, lda, b, sum)
c if sct = true, call reduce_scatter, otherwize call allreduce
if(sct) then
call mpi_allgather(n, 1, mpi_integer, counts, 1,
& mpi_integer, mycomm, ierr)
call mpi_reduce_scatter(sum, c, counts, mpi_real, mpi_sum,
& mycomm, ierr)
else
call mpi_allreduce(sum, c, m, mpi_real, mpi_sum, mycomm, ierr)
endif
c
print *, ’The values of c are ’, c(1), c(2)
c 999 call mpi_comm_free(mycomm, ierr)
call mpi_finalize(ierr)
stop
end

subroutine initab(m, myid, np, k, a, lda, b, sum)


integer m, myid, np, k, lda, i, j, l
real a(lda, *), b(*), sum(*)
do 10 i=1, m
10 sum(i) = 0.0
k = m/np
l = myid * k
if(myid .eq. np-1) k = m-l
do 20 i=1, k
20 b(i) = 1.0
do 40 j=1, k
do 40 i=1, m
40 a(i, j) = real(i+l+j)
return
end

subroutine locmv(m, n, a, lda, b, c)


integer m, n, lda, i, j
real a(lda, *), b(*), c(*)
do 20 j=1, n
do 20 i=1, m
20 c(i) = c(i)+a(i, j)*b(j)
return
end
113

MPI SCAN
C int MPI_Scan(void* sendbuf, void* recvbuf, int count,
MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
F MPI_SCAN(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, COMM, IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER COUNT(*), DATATYPE, OP, COMM, IERROR

ҕඔඪૼ

IN SENDBUF, ‫ؿ‬ෂߏԊ౵֥൮ֹᆶ.

OUT RECVBUF, ࢤ൬ߏԊ౵֥൮ֹᆶ.

IN COUNT, ჭ෍۱ඔ.

IN DATATYPE, ߏԊ౵֥ඔऌো྘.

IN OP, ‫ޅ‬ᇕ݂ჿҠቔ.

IN COMM, ๙ྐሰ.

Վ‫ݦ‬ඔ൞ MPI_REDUCE ᄝ҂๝ࣉӱᇏ֥ᇗ‫گ‬൐Ⴈ, ࣉӱ i ᇏ֤֥֞൞ᄝႮщ‫ູݼ‬


{0, 1, . . . , i} ֥ࣉӱ‫ܒ‬Ӯ֥ࣉӱቆᇏ൐Ⴈ MPI_REDUCE ࢲ‫ݔ‬, ൞၂۱ѩ҂ӈႨ֥‫ݦ‬ඔ.
ᄝ MPI ᇏิ‫܂‬ਔႨ޼ሱ‫ק‬ၬ֥Ҡቔ‫ݦ‬ඔၛડቀ҂๝ླေ, ෱Ⴎೂ༯֥ࠫ۱‫ݦ‬ඔটൌ
གྷ:

MPI OP CREATE
C int MPI_Op_create(MPI_User_function *function,int commute,MPI_Op *op)
F MPI_OP_CREATE( FUNCTION, COMMUTE, OP, IERROR )
EXTERNAL FUNCTION
LOGICAL COMMUTE
INTEGER OP, IERROR

ҕඔඪૼ

IN FUNCTION, Ⴈ޼‫ק‬ၬ֥‫ݦ‬ඔ.

IN COMMUTE, ֩Ⴟ TRUE ൞ॖࢌߐ֥, ‫ڎ‬ᄵᆺ൞ॖࢲ‫֥ކ‬.

OUT OP, ྍ֥݂ჿҠቔ.

Վ‫ݦ‬ඔ‫ק‬ၬਔ၂۱ྍ֥݂ჿҠቔ OP.

MPI OP FREE
C int MPI_Op_free( MPI_Op *op )
F MPI_OP_FREE( OP, IERROR )
INTEGER OP, IERROR
114 ֻ൅၂ᅣ MPI ಆअ݂ჿҠቔ

ҕඔඪૼ

IN OP, ݂ჿҠቔ.

Վ‫ݦ‬ඔ൤٢݂ჿҠቔ OP. ᄝ MPI ᇏ, Ⴈ޼ሱ‫ק‬ၬҠቔ֥‫ݦ‬ඔ൞Ⴕ࿸۬ေ౰֥, ఃྙ


ൔೂ༯:

C void user_function( void* invec, void* inoutvec, int *len,


MPI_Datatype *datatype )
F FUNCTION USER_FUNCTION( INVEC, INOUTVEC, LEN, DATATYPE )
<datatype> INVEC(LEN), INOUTVEC(LEN)
INTEGER LEN, DATATYPE

༯૫֥২ሰ൞Ⴈሱ‫ק‬ၬ֥౰‫ݦބ‬ඔটൌགྷಆअҠቔ֥:
program userdef
include ’mpif.h’
integer len
parameter (len = 100)
integer myid, p, mycomm, ierr, m, root, myop
real x(len), y(len)
external userfunc
call mpi_init( ierr )
call mpi_comm_dup( mpi_comm_world, mycomm, ierr)
call mpi_comm_rank( mycomm, myid, ierr )
call mpi_comm_size( mycomm, p, ierr )
print *, ’Process ’, myid, ’ of ’, p, ’ is running’
m = 100
root = 0
call initx(m, myid, x)
call mpi_op_create(userfunc, .true., myop, ierr)
call mpi_reduce(x, y, m, mpi_real, myop, root, mycomm, ierr)
call mpi_op_free(myop, ierr)
if(myid .eq. root)
& print *, ’The values of answer are ’, y(1), y(2), y(3)
call mpi_comm_free(mycomm, ierr)
call mpi_finalize(ierr)
stop
end

subroutine initx(m, myid, x)


integer m, myid, i
real x(*)
do 10 i=1, m
10 x(i) = real(i+myid)
115

return
end

subroutine userfunc(x, y, m, mpi_real)


integer m
real x(*), y(*)
do 10 i=1, m
10 y(i) = y(i)+x(i)
return
end
116 ֻ൅၂ᅣ MPI ಆअ݂ჿҠቔ
ֻ൅‫ؽ‬ᅣ HPL ӱ྽ൌ২௩༅

117
118 ֻ൅‫ؽ‬ᅣ HPL ӱ྽ൌ২௩༅
ҕॉ໓ང

uѩྛ࠹ෘ – ࢲ‫ · ܒ‬ෘ‫ · م‬щӱvđۚ֩࢝ტԛϱഠđ2003b


[1] ӧ‫ݓ‬ਅđ
[2] ෤ࡅᤘđᅦਟѯđӾ࿐ќđລ֡ੁđ
uຩ઎ѩྛ࠹ෘა‫҃ٳ‬ൔщӱߌ࣢vđ॓࿐ԛϱ
ഠđ1996b
[3] http://www.top500.org/b
[4] ‫ڈ‬഼ᇏđѩྛ࠹ෘࠎԤᆩ്đ൭۠đ2004b
[5] ଍ᄵဩđჯ‫ྖݓ‬đ
uཨ༏Ԯ‫־‬ѩྛщӱߌ࣢ MPI vđ॓࿐ԛϱഠđ2001b
[6] J. M. Ortega, Introduction to Parallel and Vector Solution of Linear Systems, Plenum Press,
1988.
[7] J. Dongarra, I. Duff, D. Soresen and H. van der Vorst, Solving Linear Systems on Vector
and Shared Memory Computers, SIAM, 1991.
[8] G. Golub and C. van Loan, Matrix Computation, The Johns Hopkins University Press, 1983.
(ᇏၲЧ: इᆔ࠹ෘ, ৷౩಴a֬ࡲྍaਾྮধၲ, ն৵৘‫۽‬ն࿐ԛϱഠ, 1988 ୍)
[9] Ӿ࿐ќ, ᄝऎႵअ҆ଽթა‫܋‬ཚᇶթ֥ѩྛࠏഈѩྛ౰ࢳཌྟٚӱቆ, ࠹ෘඔ࿐,1995
୍ֻ 17 जֻ 2 ௹.
[10] G. Y. Li and T. F. Coleman, A Parallel Triangular Solver for a Hypercube Multiprocessor,
TR 86–787, Cornell University, 1986.
[11] Ӿ࿐ќ, Transputer ഈ Cholesky ‫֥ࢳٳ‬ѩྛൌགྷ, ࠹ෘඔ࿐,1993 ୍ֻ 15 जֻ 3 ௹.
[12] J. M. Delosme and I. C. F. Ipsen, Positive Definite Systems with Hyperbolic Rotations,
Linear Algebra Appl., 77 (1986), 75–111.
[13] D. H. Lawrie and A. H. Sameh, The Computation and Communication Complexity of a
Parallel Banded System Solver, ACM Trans. Math. Soft., 10 (1984), 185–195.
[14] Ӿ࿐ќ, Transputer ഈཌྟ༢๤֥ѩྛ౰ࢳ, ᇏ‫࠹ݓ‬ෘࠏႨ޼,1991 ୍ֻ 10 ௹.
[15] ӧࣟਅ, ѩྛඔᆴٚ‫م‬, ౢ޿ն࿐ԛϱഠ,1983 ୍.
[16] ᅦЏਞaჯ‫ྖݓ‬aਾྖ௜aӧ࣑, ொັ‫ٳ‬ٚӱѩྛႵཋҵ‫ٳ‬ٚ‫م‬, ॓࿐ԛϱഠ,1994 ୍.
[17] D. Chazan and W. Miranker, Chaotic Relazation, J. Lin. Alg. Appl., 2 (1969), 199–222.
[18] G.Baudet, Asynchronous Iterative Methods for Multiprocessors, J. ACM, 25 (1978), 226–
244.
[19] J. M. Ortega and W. C. Rheinboldt, Iterative Solution of Nonlinear Equations in Several
Variables, Academic Press, 1970.
[20] Ӿ࿐ќ, ཌྟٚӱቆ֥ၳ҄‫ם‬ս‫م‬, ࠹ෘඔ࿐,1992 ୍ֻ 14 जֻ 3 ௹.

119
120 ҕॉ໓ང
‫ڸ‬੣၂ ѩྛӱ྽ष‫۽ؿ‬ऎაۚྟିӱ྽९

§A.1 BLASaLAPACKaScaLAPACK

§A.2 FFTW

§A.3 PETSc

121
122 ‫ڸ‬੣၂ ѩྛӱ྽ष‫۽ؿ‬ऎაۚྟିӱ྽९
‫ڸ‬੣‫ؽ‬ MPI ‫ݦ‬ඔ reference
෬ႄ: MPI ‫ݦ‬ඔđᇗေ‫୑ۀ‬a଀Ս

123
124 ‫ڸ‬੣‫ ؽ‬MPI ‫ݦ‬ඔ reference
෬ ႄ
LU ‫ࢳٳ‬, 37 PVP, 11
‫طٳ‬ᇍᆭ, 27
recv, 31
‫ࢳٳିۿ‬, 24, 25
ࡆ෎б, 21 send, 31
इᆔӰࠒ, 32 SIMD ༢๤, 11
ऍն็ᅞ, 5 SMP, 11–13
ज৺թԥ, 37–39
TOP500, 9, 11
ॖঔᅚྟ, 9
৬؇, 21
ਙೡ૭, 39
ੀඣཌ, 25
౵თ‫ࢳٳ‬, 23
ඔऌԮൻ, 31
ච౷эߐ, 42, 44
๝҄ѩྛෘ‫م‬, 27, 28
ເᆞࢌ, 43
ၳ҄ѩྛෘ‫م‬, 28
ၳ҄‫ם‬ս, 49, 50

Amdahl ‫ੰק‬, 21
ASCI ࠹߃, 6

Cannon ෘ‫م‬, 35
Cholesky ‫ࢳٳ‬, 41, 42
Cluster, 11, 15

DSM, 11, 13, 14

Gustafson ‫܄‬ൔ, 21

HPCC ࠹߃, 5

Linpack, 37

MIMD ༢๤, 11
MPP, 11, 14, 15, 31

125

You might also like