  Linux Parallel Processing HOWTO
  Hank Dietz, pplinux@ecn.purdue.edu
  v980105, 5 January 1998
    hisai@din.or.jp
  2001/5/15

  񏈗Ƃ̓vO̎sxグl 1 wAvO
  𓯎Ɏs\ȕ̕ɕAꂼvZbTœ
  BvO N ̃vZbTɕĎs΁A 1 ̃vZbT
  œ̂ɔׂ N {słƍl܂B̃hLg
  ł́A{I 4 ̕񏈗̕@܂B Linux [U
  pł@ŁASMP Linux VXeAlbg[NłȂĂ
  Linux VXeŃNX^gށA}`fBA(Ȃ킿AMMX)
  g񏈗A Linux VXe(Ɨ) ڂĂtv
  ZbT𗘗pƂ̂ɓ܂B
  ______________________________________________________________________

  ڎ

  1. ͂߂
     1.1 񏈗ɋ߂̂H
     1.2 p
     1.3 ASY̗
     1.4 ̃hLg̍\

  2. SMP Linux
     2.1 SMP ̃n[hEFA
        2.1.1 ꂼ̃vZbT͓Ǝ L2 LbVĂ邩H
        2.1.2 oX̍\H
        2.1.3 ̃C^[u DRAM ̋ZpH
     2.2 LgvO~O͂߂ɂ
        2.2.1 ׂĂL̂AꕔL̂
           2.2.1.1 ׂĂL
           2.2.1.2 ꕔL
        2.2.2 Ag~bNȏƏ̏
        2.2.3 ϐ̕ۑ̂
        2.2.4 bN
        2.2.5 LbVEC̑傫
        2.2.6 Linux ̃XPW[̖_
     2.3 bb_threads
     2.4 LinuxThreads
     2.5 System V ̋L
     2.6 }bvEVXeR[

  3. Linux VXeŃNX^g
     3.1 ȂNX^Ȃ̂H
     3.2 lbg[N@
        3.2.1 ArcNet
        3.2.2 ATM
        3.2.3 CAPERS
        3.2.4 C[Tlbg
        3.2.5 C[Tlbg(t@[XgEC[Tlbg)
        3.2.6 C[Tlbg(MKrbgEC[Tlbg)
        3.2.7 FC (t@Co[E`l)
        3.2.8 FireWire (IEEE 1394)
        3.2.9 HiPPI  Serial HiPPI
        3.2.10 IrDA (Infrared Data Association)
        3.2.11 Myrinet
        3.2.12 Parastation
        3.2.13 PLIP
        3.2.14 SCI
        3.2.15 SCSI
        3.2.16 ServerNet
        3.2.17 SHRIMP
        3.2.18 SLIP
        3.2.19 TTL_PAPERS
        3.2.20 USB (Universal Serial Bus)
        3.2.21 WAPERS
     3.3 lbg[Nɑ΂\tgEFÃC^tF[X
        3.3.1 \Pbg
           3.3.1.1 UDP vgR(SOCK_DGRAM)
           3.3.1.2 TCP vgR(SOCK_STREAM)
        3.3.2 foCXEhCo
        3.3.3 [Ux̃Cu
     3.4 PVM (Parallel Virtual Machine)
     3.5 MPI (Message Passing Interface)
     3.6 AFAPI (Aggregate Function API)
     3.7 NX^T|[gĂ邻̑̃Cu
        3.7.1 Condor(vZXE}CO[VT|[g)
        3.7.2 DFN-RPC (German Research Network - Remote Procedure Call)
        3.7.3 DQS (Distributed Queueing System)
     3.8 p\ȃNX^̈ꗗ
        3.8.1 Beowulf
        3.8.2 Linux/AP+
        3.8.3 Locust
        3.8.4 Midway DSM(UL)
        3.8.5 Mosix
        3.8.6 NOW (Network Of Workstations)
        3.8.7 Linux g񏈗
        3.8.8 Pentium Pro NX^̃Z~i[
        3.8.9 TreadMarks DSM (UL)
        3.8.10 U-Net (User-level NETwork interface architecture)
        3.8.11 WWT (Wisconsin Wind Tunnel)

  4. SIMD Within A Register(Ⴆ MMX 𗘗p)
     4.1 SWAR ̉DĂ̂H
     4.2 SWAR vO~O
        4.2.1 |tBbNȑ
        4.2.2 
           4.2.2.1 
           4.2.2.2 R[hCāA߂gȂ
           4.2.2.3 tB[hl̐
        4.2.3 lԂ̂Ƃƌ^ϊ
     4.3 Linux ɂ MMX g SWAR

  5. Linux ɓڂĂtvZbT
     5.1 DꂽzXgA Linux PC
     5.2 DSP Ă݂܂H
     5.3 FPGA  č\\Ș_vZH

  6. ʓIȋƂ
     6.1 vO~OƃRpC
        6.1.1 Fortran 66/77/PCF/90/HPF/95
        6.1.2 GLU (Granular Lucid)
        6.1.3 Jade  SAM
        6.1.4 Mentat  Legion
        6.1.5 MPL(MasPar Programming Language)
        6.1.6 PAMS(Parallel Application Management System)
        6.1.7 Parallaxis-III
        6.1.8 pC++/Sage++
        6.1.9 SR (Synchronizing Resources)
        6.1.10 ZPL And IronMan
     6.2 ptH[}X̖
     6.3 _\A܂傤

  7. {Ŏӎ

  ______________________________________________________________________

  1.  ͂߂

  񏈗Ƃ̓vO̎sxグlŁAvO𓯎Ɏs
  \ȕ̕ɕAꂼvZbTœ܂BvO
   n ̃vZbTɕĎs΁A1 ̃vZbTœ̂ɔ
  ׂ n {słƍl܂B

  ܂ŕ̃vZbTVXéAŐ݌vuR
  s[^vƂĐ̒ɑ݂Ă܂Bł́Aɉ Linux
   SMP VXe(uT[ovƂĔ̔Ă邱Ƃ)񋟂Ă
  ܂B 1 ̃Rs[^ŕ̃vZbT 1 ̃ƃoX
  ̃C^tF[XpĂ܂BRs[^𕡐pӂ (
  Ⴆ Linux Ă镡 PC pӂ)lbg[NłȂŕ
  񏈗NX^gނƂł܂BLinux g񉉎Z 3 Ԗڂ
  @́A}`fBAg(Ȃ킿 MMX)gāAf[^̃xN
  gɈ@łBṒApɓڂĂ񏈗vZG
  W𗘗p̂ Linux VXezXgɂĂ܂AƂ@
  B̃hLgł́A炷ׂẴAv[`ڂĂ
  Ƃɂ܂B
  1.1.  񏈗ɋ߂̂H

  ̃vZbT͊mɑ̏ɂ܂A񏈗ɂĉ
  b󂯂ȂAvP[V݂܂BʓIɂ͕񏈗Ō
  ô͉L̏ꍇɌ肳܂B

  o  AvP[VvZbTIɎgp悤񉻂ق
     Ă邱ƁBʂŁA̓vÖꕔƗē
     A̕ƗvZbTŕ񂵂ē삷Ƃ݂Ȃ
     ɂقȂȂBAŎsł邱Ƃ̃VXeł͂
     ďxxȂĂ܂\邱Ƃ킩ĂB
     ΁A1 ̃vZbTŎs 4 bvOƂB
     ̃vOA4 ̃}Vłꂼ 1 bŎsłƂĂA
     ̃}Vē삷̂ 3 bȏォĂ܂΁A
     ͏xオƂɂ͂ȂȂ

  o  sƎvĂAvP[V񉻂Ă(񏈗
     Ɏ蒼Ă)AȂƂ񏈗Ōʂł悤ɐVɃA
     vP[VɎ肪邱

  o  񏈗Ɋ֘A鎖ɂ̌ɋ邩AȂƂ
     ӎu邱ƁBVXeŕ񏈗gp邱Ƃ͕K
     Ƃł͂ȂARs[^̗p҂̑唼͕񏈗ɏڂȂA
     ̂Ƃu߂Ă̕񏈗vƂ悤ȏЂ݂ȂB
     HOWTO ͗邫ƂĂ͊D̂̂AׂĂԗĂ
     킯ł͂Ȃ

  KȂƂɏLׂĂ{łĂALinux 𗘗p񏈗̓X[
  p[Rs[^̃ptH[}XŕGȌvZ⋐ȃf[^Zbg
  ܂BAȃn[hEFA(ɏLĂ悤)Ŏł
  ̂͂łBɗǂƂɂ́AɏقǖZȂ
  ΁A Linux VXeő̏ȒPɎsł܂B

  񏈗]ł킯ł͂ȂAȂɃptH[}X̌B
  ƎvĂȂAł͑ɂ܂܂BႦ΁As
  vÕptH[}Xグɂ́A荂ȃvZbTւ̊
  ⃁̑݁AfBXN IDE  Fast Wide SCSI Ɍ铙̕@
  ܂B̓_Ɋ֐SȂAZNV 6.2 ɐiłB
  łȂ΂̂܂ܓǂݐi߂ĂB

  1.2.  p

  񏈗͂܂ŗlXȃVXeōsĂĂ܂ARs[^
  [Ȗ啔ɂƂāA܂قǂȂ݂킯ł͂܂B
  ŁA낢ȕ񏈗ɂĘ_OɁA悭gp̂
  𗝉Ă܂傤B

     SIMD:
        SIMD(Single Instruction stream, Multiple Data stream)͕s
        f 1 ŁAvZbTׂĂZ𓯎ɍsB
        Aꂼ̃vZbT͌ŗL̃f[^ȂB
        f́Az̊evfɑ΂ēlȉZƂAxNgz
        Ɋ֘A𓾈ӂƂBŔAZׂĂƂƓ
        ĂāASIMD vZbTԂ̂Ƃ肪ȒPǂ₷
        ł

     MIMD:
        MIMD(Multiple Instruction stream, Multiple Data stream)͕
        sf 1 ŁA{IɃvZbTꂼ͓Ɨē삷
        B̃f͕̃vO𗘗pāA@\x[X
        Ɏs邱ƂɒĂBႦ΁AvZbTf[^
        x[X̍XVsĂԁÃvZbT͐Vɓ͂ꂽ摜
        ̕\ĂƂɁB̃f SIMD Rx
        ÃfobNKvƂȂ鋣ԂɊׂ\A
        vOfIɗ댯B̓vZbTĎs
        s^C~O̖ŁÃvZbT̃^C~OƂ̊֌W
        Đł

     SPMD:
        SPMD(Single Program, Multiple Data)͋@\肵 MIMD ŁAv
        ZbTׂĂvOsBSIMD Ƃ͈قȂASPMD
        ̃R[hsvZbT̓vOłꂼقȂ
        ̗Ƃ

     ʐMш敝 (Communication Bandwidth):
        ʐMn̑ш敝Ƃ́A]͂܂ĂPʎԓɓ]ł
        ő̃f[^ʂ\BVAڑ̑ш敝 {[(baud) rb
        g/b (b/s)ŕ\̂ʂA̓oCg/b (B/s)̂
        1/10  1/8 ɓBႦ 1200 {[̃f́A 120 rb
        g/b`A155 M rbg/b ATM ́Af 130,000 {
        A17 M rbg/b`łBш悪LΑ傫ȃubÑf[
        ^`邱ƂłAvZbTԂŌǂf[^
        

     ʐMx(Communication Latency):
        ʐMn̒x́Aúv`̂ɂŏԂłB
        ɂ͑Mɂ\tgEFÃI[o[wbh܂܂Ă
        B񏈗ɂƂĒx͂ƂĂdvłAꂪLȍŏ̗
        x肷BR[hPʂsĂ鎞ԂZقǁAs
        ɂȂB{IɁAR[hPʂs鎞Ԃ̎sʂ
        (Ⴆ΁Ax)Z΁AvZbTŕԂlKvƂ
        AR[h̎śAs葬Ȃ͂łBA
        ̎śAʐM̃I[o[wbhKv

     bZ[WʐM(Message Passing):
        bZ[WʐḾAVXeŃvZbTԂłƂ肷郂f
         1 łBʂ͂vZbT̃\tgEFAbZ[
        W쐬A݂ɐڑĂlbg[NoRđB
        ꂽbZ[W͎MAbZ[W̓esKv
        BbZ[WI[o[wbh(x)傫ȂA
        ʏ̓bZ[Wɂǂ̂炢܂߂邩ɂĂ͂قƂ
        ȂBāAbZ[WʐM͍Lш𐶂A
        f[^傫ȃubNɂ邱ƂɂAvZbTԂłƂĂ
        IɂƂ肪łBAbZ[WʐM͎Ԃ鏈
        ̂ŁA̕KvŏɂȂ΂ȂȂB񏈗vO
        ̃f[^\́ALvZbTԂɂ܂Ă̂ŁAꂼ
        vZbTQƂf[^́A[JȃɂKv
        B̍Ƃf[^zuƌ

     L(Shared Memory):
        ĹAVXeɂvZbTԂ̂Ƃɂ
        ̃f 1 łBPentium ڂĂ悤ȕ
        vZbT}V Linux Ăꍇ́AvZbT 1 
        𕨗IɋLĂBĂvZbTL
        ɒlނƑ̂ǂ̃vZbTڃANZX\ɂ
        BƂ͕ʂɘ_IɋLĂ郁ĂVXe
        B̊eX̃vZbT͓Ǝ̃A[JłȂ
        ւ̎QƂvZXԒʐMɓKXuBʂǂ̋L
        ̎ƂĂAbZ[WʐM₷BI
        Lꂽ͍Lш敝g邾łȂAxȂB
        ͕̃vZbTɃoXɃANZXȂ悤ɂ
        ꍇłBāAf[^zu͂͂ptH[}Xɏd
        ȉe^ALbV̌ʓłǂ̃f[^zuœKȂ̂
        f͓̂

     WZ(Aggregate Functions):
        bZ[WʐMALfƂAʐM̂͒PƂ̃v
        ZbTƂȂBƂ͑ΏƓIɁA̕񏈗f
        W񉉎Z̒ʐMł́AevZbTAē삷
        B̂悤ȓ̓oA(barrier synchronization)ƌĂ΂
        ĂBX̃vZbT́AꂽvZbT̂ꂼꂪ
        ̂鋫EɒB܂őҋ@BvZbTɂ鋫EɒB
        Ƃl𐶐邱ƂŁAʐM@͂ꂼ̃vZbT
        ɒlԂƂ\ɂȂB̃vZbT́AƎ̉Zœ
        lׂĎWʂʐM@̕ԂlƂĕԂƂł
        B͗Ⴆ΁uǂ̃vZbT𓚂HvƂ
        ̕ԓԂlɂȂꍇ邵Aꂼ̃vZbT̒l
        vԂlɂȂꍇBxɂ߂ďȂʁAvZbT
        ̑ш敝XɂBÃf̓f[^l𕪎U
        ƂAs𐧌䂷邱Ƃ̖ړIƂĂꍇ
        

     WʐM(Collective Communication):
        WZ̕ʖŁAWZ𕡐̃bZ[WʐMgĎ
        ꍇɂ悭g

     SMP:
        SMP(Symmetric Multi-Processor)̓Iy[eBOEVXe̊TO
        ŁAΓɋē삷vZbT̏W\B܂Av
        ZbTꂼꂪ̕܂ɏB
        ʁASMP  MIMD ƋLgݍ킹ĎBIA32 g
        VXeł́ASMP  MPS(the Intel MultiProcessor
        Specification)ɏĂBIɂ́AuSlot 2vcӖ
        ƂɂȂ邩Ȃ

     SWAR:
        SWAR(SIMD Within A Register)̓WX^𕡐̐̈ɕ
        lŁAWX^߂gĂ̕ꂽ̈ SIMD 
        񉉎ZsB k rbg̃WX^ƃf[^pXƉZu
        }Vł́Aʏ̃WX^ SIMD ̕񏈗œƂm
        ĂB܂ k/n rbg̗̈̒lƂ n słB
        ̃^Cv̕񏈗͐WX^␮߂gĎs
        ʓIAŋ߂̃nCGhȃ}CNvZbT͓̑
        ߂ǉāA}`fBA֘ÃptH[}Xコ
        ĂBIntel  AMDACyrix  MMX(MultiMedia eXtensions)
        ɓAɂ Digital Alpha  MAX(MultimediA eXtensions)
        Hewlett-Packard PA-RISC  MAX(Multimedia Acceleration
        eXtensions)AMIPS  MDMX (Digital Media eXtension "Mad Max" 
        )ASun SPARC V9  VIS (Visual Instruction Set)BMMX
        ̗pĂx_[ 3 ЂāA̖߃Zbgׂ
        ́AĂ邱Ƃ͎Ă邪Aꂼʌ̂̂ł

     tvZbT(RvZbT):
        {AtvZbT͓ʂȗpr̃Rs[^ŁAzXgƂ
        VXeɑAȌvZɎsBႦ΁APC 
        rfIJ[hI[fBIJ[h̑ɂ͕tvZbTڂĂ
        AꂼɋʂĂ摜I[fBI DSP(Digital
        Signal Processing)B܂ɃACEv
        ZbT݂BĂ΂闝ŔAAC(z)ɔzu
        tvZbTŁAwIZɎs邩łB
        Iɂ́Ap̃X[p[Rs[^̑̓[NXe[VƂ
        zXgɕtvZbTڂ̂ł

     RAID:
        RAID(Redundant Array of Inexpensive Disks)́AfBXNo͂̑
        敝ƐMコZpwBoG[V
        AʂČƂȂl 2 B 1 ́Af[^ubN
        ꂼ n+k ̃fBXNhCuQɃXgCvĂA
        ̃hCu̓f[^ 1/n ǂݏȂ΂Ȃc
        Ƃ𗘗pāA1 ̃hCuɑ΂ď] n {̑ш敝
        邱ƂłB 2 ́Af[^璷ɏƂɂāA
        fBXNhCu 1 Ăf[^𕜋ł邱ƂłB
        ͏dvȂƂŁA璷ĂȂƁAn+k ̃fBXNhCu
        ǂꂩ 1 łʖڂɂȂꍇAt@CVXeSɉ
        ܂ƂɂȂBRAID ɂĂ̊Tvm肽Ȃ΁A
        <http://www.adaptec.com/worldwide/product/prodtechindex.html?cat=%2fTechnology%2fRAID>
        ALinux VXe RAID ǂ̂悤Ȃ̂邩m肽
        ΁A <http://linas.org/linux/raid.html> QƂ̂ƁBRAID p
        ̃n[hEFÃT|[g͕ʂƂāALinux ̓\tgEFA RAID
        0A1A4A 5 T|[gĂÃfBXN 1  Linux V
        XeňBڍׂ́ASoftware RAID mini-HOWTO  the Multi-
        Disk System Tuning mini-HOWTO QƂ̂ƁBNX^g񂾕
        ̃}Vŕ̃fBXNhCuɂ܂ RAID gނ
        ́AftHgł̓T|[gĂȂ

        y󒐁FMulti-Disk System Tuning mini-HOWTO ̓{
        <http://www.linux.or.jp/JF/JFdocs/Multi-Disk-HOWTO.html> łz

     IA32:
        IA32(Intel Architecture, 32-bit)͕񏈗Ƃ͖֌WAv
        ZbT̖߃Zbg Intel  386 ƌ݊邩ɂĂӂ
        ĂB{IɁAIntel  286 Ȍ x86 vZbT́A32 rb
        g̃tbgȃfĂāAꂪ IA32 ̓ƂȂ
        ĂBAMD  Cyrix AIA32 ݊̃vZbT𐔑Ă
        BLinux Ƃ IA32 vZbTŔWAisꂪ IA32 
        SƂČ`ꂽŔA PowerPC  AlphaAPA-
        RISCAMIPSASPARC ̂ȊÕvZbTƔׂėp₷
        _ɂBׂ IA64(64-bit with EPIC, Explicitly
        Parallel Instruction Computing)͂Ƃ܂͂Ȃ
        BMerced ƌĂ΂ŏ IA64 vZbT 1999 N̎_ł
        ̌ʂĂȂB

        y󒐁FMerced ̓vZbT̃RAƂȂAvZbTƂ
        ́AuItaniumv̂ƂȂ܂Bił 2001 N̒
        ɂȂ\łBɑ 2 RÁuMcKinleyvAiEX
        ĂāA2001 N㔼ɓoꂷ\łB AMD ́A
        uClawHammervƌĂ΂ 64 rbg`bv 2002 N㔼ɓoꂳ
        \łz

     ŝ̊i:
        ̕X[p[Rs[^ƂĂAvZVXe
        ̕Kvŝ̊i_ĂBWindows ɌX|Ă
        ȂAŝ̊i PC g񏈗Zp𐶂
        ́ASMP  Windows NT T[o MMX glX Windows ̃Av
        P[VƂƂɂȂ邪A̍lɂ͉Ƃ낪
        Bŝ̊iɑ΂l̔wiɂ́AJɂ鎞ԂƔp
        ̍팸BāA֗ʂɓłŝ̊i
        ́AȂƂTuVXeɑ΂ďis헪̉b炵
        B헪ڎwĂ̂Ƃ͈ZpʓIɗp
        邱Ƃ̂Ȃ̂B̏ꍇAŝ̊ip񏈗
        ̓NX^wAm[h𕁒ʂ PC ō\Blbg[
        NEC^tF[X\tgEFA͉JX^}CYĂc
        ʂ Linux Ńt[ŗpł(Ⴆ΁ARs[tgpu
        bNEhC)AvP[VĂ邪A͎ŝ̊
        ił͂Ȃ

  1.3.  ASY̗

   HOWTO łꂩЉĂlXȕvO~O@𗝉
  ɂ́AĂƂLȎiłBǂȒPȕASY
  łƂĂA̗lXȕvO~OVXẽAv[`
  ĂASYIԂƂŁAȂƂrΏƂyɂȂ
  ܂B M.J.Quinn ̒ł Parallel Computing Theory And
  Practice, second edition, McGraw Hill, New York, 1994 ł́A~v
  ZASY邱ƂŁA낢Ȏނ̕X[p[R
  s[^ł̃vO~O(Ⴆ nCUBE ̃bZ[WʐM Sequent
  ̋L) 𖾂炩ɂĂ܂B HOWTO ł͓bIȃAS
  YgĂ܂B

  ̃ASÝA~̋ߎl x p`̗̈v邱ƂŌvZ
  ܂BC ̃vOőfɏsƁAASY͉L̂悤
  ɂȂ܂B

  ______________________________________________________________________
  #include <stdlib.h>;
  #include <stdio.h>;

  main(int argc, char **argv)
  {
    register double width, sum;
    register int intervals, i;

    /* get the number of intervals */
    intervals = atoi(argv[1]);
    width = 1.0 / intervals;

    /* do the computation */
    sum = 0;
    for (i=0; i<intervals; ++i) {
      register double x = (i + 0.5) * width;
      sum += 4.0 / (1.0 + x * x);
    }
    sum *= width;

    printf("Estimation of pi is %f\n", sum);

    return(0);
  }
  ______________________________________________________________________

  ̏s̃ASÝAuɂ߂ĕ񐫂グāvsł
  B̈͊ԊuPʂɍוAvZbT̐̕ԊuPʂŊ蓖
  ĂƗɍvł܂Bł̓vZbTԂ̒Ƃ͕Kv
  ܂B[Jł̍vvZ΁Avđv΂
  킯łB̒iKł̓vZbTԂŉ炩̒ƌvZ܂B
  ŏIIɁȂv~̋ߎlƂăvZbT 1 lo
  ܂B

   HOWTO ł́ÃASY\lXȕ񏈗̎
  邱ƂŁAvO~O@̗lXȑĂ܂B

  1.4.  ̃hLg̍\

  ̃hLg̎c̕ 5 ɕĂ܂BZNV 2 
  3A4A5 ꂼ́ALinux gĕ񏈗T|[g 3 ̈قȂ
  n[hEFA̍\ɂӂĂ܂B

  o  ZNV 2 ł SMP Linux VXe_B̃VXéAL
     g MIMD ̂܂܎sł邪AbZ[WʐMȒP
     łBLinux ͍ő 16 ̃vZbT̐ݒT|[gĂ
     邪ASMP PC VXȇ啔 2  4 ̓ƗvZbT
     𓋍ڂĂ

  o  ZNV 3 ł̓lbg[NɐڑĂ Linux 삵Ă}
     Vō\NX^ɂĘ_BNX^Ƃ͕񏈗VXe
     ŗpAMIMD ̎sƃbZ[WʐMA_IȋL
     T|[gBSIMD ̎sV~[gAWZʐMT
     |[gĂ邪A̓lbg[N̎@ɈˑĂBNX^
     ̃vZbT̐ 2  ɂ܂ŋyԂA𐧌v
     ̑ 1 ̓lbg[N̎񂵂łB1 ̃NX^ɗlXȃ^Cv
     ̃}VgݍނƂ\łBႦ΁ADEC  Alpha  Pentium
      Linux VXeō\ꂽlbg[Nً@NX^ƌĂ

     y󒐁FDEC  Compaq ɋz܂AAlpha }V݂͌łz

  o  ZNV 4 ł́ASWAR(SIMD Within A Register)_B͔
     ɐ̂sfł͂邪AʓIȃvZbTɑgݍ
     ꂽ@\łBŋ߂ł MMX(₻̑ގ)߃Zbggv
     ZbTɉĂÃAv[`LɂȂĂ

  o  ZNV 5 ł́ALinux PC PƂ̕vZVXe𓮂zXg
     ƂĎgp@_BtvZbT͒ǉ̃J[h͊O
     t@̌`ƂāALinux ɓ̃^CṽAvP[V̎s
     ɑ΂Ĉ|Iȏp[񋟂BႦ΁A ISA J[h
     p邱ƂŁAɓڂĂ镡 DSP vZbTgČvZ
     d傫ɐ 100 MFLOPS ̔\͂ƂłB
     ̒ǉ̃{[hނ́A܂ɃvZbT̂̂łBOS 
     킯łAfBXN[̓o͂Ȃǂ킯ł͂ȂB̂
     ȃVXepɂ́ALinux ƂuzXgvL̋@\
     Kv

  ̃hLg̍Ō̃ZNVł́ALinux g񏈗ʂ̊
  AɂāAL̓̃Av[`ɂ薳̓グ
  ܂B

  ̃hLgǂނɓċCɎ~߂Ăė~Ƃ́AׂĂ
  ؂Ă킯ł͂ȂAƂƂłB܂ł̎
  u܂܂̂̂łv(uv悤ɂ͓ȂvƂK
  ł ;-)  Linux g񏈗͌łɗ܂A
  ǂ̂ɂׂAO[vƂĂ̊ő
  ܂B

   HOWTO ̒҂́Am Hank Dietz ŁA݃CfBAiB
  X֔ԍ 47907-1285AEGXgt@CGbgɂp[fwɂ
  āA Electrical and Computer Engineering ̏Ă܂BDietz
  ͂̃hLgɑ΂āAthe Linux Documentation Project ̃KCh
  CɏLĂ܂B̃hLg̔\ɓāA
  mŌɂȂ悤ɓw͂܂A Dietz уp[fw͂
  Ȃɑ΂ĐӔC𕉂ȂłȂAp[fw͂ŋc
  _ꂽ₻̐ʕɑ΂āAۏ؂܂B

  y󒐁F҂ Hank Dietz ́A1999 N 9 ɃP^bL[wɈٓ
  AɂƂȂ̒SwɈڂ܂B̃hLg
  łqׂĂގg̕񏈗̌́A KAOS
  <http://aggregate.org/KAOS/> O[vŌpĂ܂B̐ʕ
   KLAT2 <http://aggregate.org/KLAT2/> ғĂ܂B KLAT2
  ́AIEEE/ACM SC2000 <http://www.sc2000.org/> ɂ Gordon Bell Award 
  󂯂Ă܂Bp[fwł̐ʋyэŋ߂̌ɂẮAThe
  Aggregate <http://aggregate.org/> Ō邱Ƃł܂z

  2.  SMP Linux

  ̃hLgł́A SMP Linux
  <http://www.linux.org.uk/SMP/title.html> VXe񏈗Ɏg@
  ɂāAv_܂ŌĂ܂B SMP Linux ̍ŐV̏
  ́ASMP Linux vWFNg̃[OXgœ
  Bmajordomo@vger.rutgers.edu  subscribe linux-smp Əēdq[
  𑗂ƎQł܂B

  SMP Linux ͖{ɓ삷̂ł傤H 1996 N 6 ɐVi(̓m[
  uh ;-)100MHz 쓮 Pentium  2 ڂVXew܂
  Bp[cgݏグVXeŁAvZbT Asus ̃}U[{[
  hA256 K ̃LbVA32 MB  RAMA1.6 GB ̃fBXNA6 {
  CD-ROMArfIJ[h Stealth 64A15 C` Acer ̃j^[
  āAv 1,800 hłBvZbT 1 ̃VXeƔׂĐ 100
  hȂ܂B SMP Linux 𓮂͓̂Ƃł͂ȂAPƃv
  ZbTṕuʂɂĂvLinux CXg[āAmakefile 
   SMP=1 Ƃs̃RgOāAJ[lăRpC(SMP 
  1 ɐݒƂ́AƔł ;-)Alilo ɐVJ[lݒ肷
  ΂łB̃VXẽptH[}X͐\ȂA萫\
  łBȗC̃[NXe[VƂĊ􂵂Ă܂B܂
  SMP Linux ͎ۂɓĂ̂łB

  ɂ킩Ȃ̂́A͂ SMP Linux łǂ̒x̃x̍ŋL
  gvOR[fBOĎsł邩ƂƂ
  傤B 1996 NOł́A܂\Ƃ͂܂łB󋵂͕
  ܂BႦ΁A݂ł͋ɂ߂Ċx POSIX XbhCu
  ܂B

  {̋LƔׂăptH[}X͗܂ASMP Linux VX
  eł́AƂƃ\PbgʐMg[NXe[VœNX
  ^pɊJ񏈗p̃\tgEFÂقƂǂ𗘗pł܂B\Pb
  g(ZNV 3.3 QƂ̂)́APƂ SMP Linux œ삵ANX
  ^lbg[Nőg񂾕 SMP }Vł삵܂BA\
  Pbg SMP ɂƂĂ͕KvȂI[o[wbhȂ葽܂B
  I[o[wbĥȂ̓̕J[l⊄荞ݐɂ܂Bꂪ
  ɈĂ܂BƂ̂Aʏ SMP Linux ́AJ[l
  œɓłvZbT 1 ŁA荞݃Rg[Ƃ
  ĐݒłvZbT 1 Ȃ̂łB܂u[gv
  ZbT荞݂܂Bɂ炸AWI SMP
  ̒ʐM@́A啔̃NX^g񂾃lbg[NDĂ܂B
  NX^pɐ݌vꂽ\tgEFAANX^œ SMP 
  ܂삷邱Ƃ悤łB

  y󒐁FLinux ̃J[l 2.4 ɂȂ SMP Ήǂ܂B 2.2
  nȑOł́AVXeR[ĂяoƂꂪĂvZbT
  J[l𗣂܂ŃJ[lŜɃbNĂ܂B܂葼̃v
  ZbTJ[l𗘗p悤ƂĂ(VXeR[𔭍sĂ)A
  J[l̃bN͂܂(ݓĂVXeR[̏I
  ܂)҂ɂȂĂ܂B2.4 nł̓J[lŜł͂ȂA
  J[lŃvZbTԂŋLĂ鎑Pʂł̃bN\ɂȂ
  ܂BׂĂPʂł̃bNɕύXꂽ킯ł͂ȂAˑR
  ƂăJ[lbN镔܂B荞݂ɂĂAꂼ
  ̃vZbT炩邱Ƃ\ɂȂ܂z

  ̃ZNV̎c̕ł́ASMP ̃n[hEFAɂĘ_ALinux
  ŕvÕvZXL{IȂ݂čs
  Ƃɂ܂BAg~bNȏϐ̕ۑÃbNALbVE
  Cɂ ӌqׂāAŌɑ̋L񏈗ɂ
  ̎ЉƎv܂B

  2.1.  SMP ̃n[hEFA

  SMP VXe͂NĂ܂Aŋ߂܂Ŋ{Iȋ@\
  ꂼ̃}VňقȂXɂ߁AIy[eBOVXe
  ̃T|[g͈ڐAƂ͌܂łB̏󋵂ς邫
  ɂȂ̂AMPS ƌĂ΂ Intel  Multiprocessor Specification
  łBMPS 1.4 ̎dĺAPDF t@C
  <http://www.intel.com/design/pro/datashts/242016.htm> 痘pł
  B܂ MPS 1.1 ɂĂ̊Tv
  <http://support.intel.com/oem_developer/ial/support/9300.HTM> y󒐁F
  N؂zɂ܂BAintel  WWW TCg͂悭\ς
  ŒӂĂBvZbTő 4 ܂œڂ MPS ݊̃VXe
  ́Ãx_[ <http://www.uruk.org/~erich/mps-hw.html>\z
  Ă܂B MPS ͗_Ƒ̃vZbTT|[gĂ
  ܂B

   MPS   IA-32 ȃVXe SMP Linux T|[gĂ̂́A
  Sun4m ڂ}`vZbT SPARC }VłBSMP Linux  Intel
   MPS o[W 1.1  1.4 ݊̃}VT|[gĂA16
  ܂ł 486DXAPentiumAPentium MMXAPentium ProAPentium II T|[
  gĂ܂BT|[gĂȂ IA-32 vZbTɂ́AIntel  386 
  Intel  486SX/SLC ł(SMP ݂̂ƕ_ZuȂC^
  tF[X܂)B AMD  Cyrix vZbT(SMP T|[g`b
  vقȂ̂ŁÃhLgĂ鎞_ł͗pł܂)
  グ܂B

  y󒐁Fɏqׂ KLAT2 <http://aggregate.org/KLAT2/> ́AAMD 
  Athlon 𓋍ڂĂāASWAR Ƃ intel  MMX ɉāAAMD ̃}`
  fBAg߂ł 3DNow! pĂ܂z

  ؂Ȃ̂́AMPS ݊̃VXẽptH[}X傫΂Ƃ
  mĂƂłBF̗\zʂAvZbT̑x̓ptH[}X
  ̍ɉe^v 1 łBNbNxΑقǁA
  荂ȃVXeɂȂXɂ܂APentium Pro  Pentium 
  łB MPS ̂͋L̎ǂ̂悤ł邩ɂ
  dl߂Ă킯ł͂ȂA\tgEFA̓_ǂ̂悤Ɏ
  @\ׂȂ̂߂Ăɉ߂܂B܂ptH[}XƂ́A
  L̎ǂ̂悤 SMP Linux ⃆[ŨvO̓Ƒ
  ɘAWĂ邩̌ʂł܂B

  ܂ MPS ɏVXeꂼŌȂ΂Ȃ̂́Aǂ̂悤
  ɃVXeIȋLɃANZXł̂ƂƂłB

  2.1.1.  ꂼ̃vZbT͓Ǝ L2 LbVĂ邩H

  MPS Pentium ̈ꕔ₷ׂĂ MPS Pentium ProAPentium II VXéA
  Ɨ L2 LbVĂ܂(Pentium Pro  Pentium II ̓
  W[ɑgݍ܂Ă܂)BƗ L2 LbV͈ʓIɃR
  s[^̃ptH[}XőɈoƌȂĂ܂ALinux
  ł͂قǒPł͂܂BGɂĂ 1 ̌́A
  SMP Linux ̃XPW[vZXꂼ𓯂vZbTɊ蓖đ
  Ȃ悤ɂĂ_ɂ܂B̓vZbTEAtBjeBƌĂ
  ĂlłB͂ɂłύX邩܂Bŋ߁uv
  ZbTEoCfBOvƂ^CgŁASMP Linux ̊JR~j
  eBł̍lxc_܂BvZbTEAtBjeBȂ
  ƁAƗ L2 LbV݂ꍇłȂI[o[wbh
  Ă܂܂B́AvZXŌɎsĂvZbT
  ͂ȂAʂ̃vZbTŃ^CXCX蓖Ăꂽꍇɔ
  B

  y󒐁FJ[l2.2nł́A CPU ɓ̃vZX蓖Ă邱
  Ƃ͕Wł͂ł܂񂪁Apb`Ƃ PSET - Processor Sets for the
  Linux kernel( <http://isunix.it.ilstu.edu/~thockin/pset/>) pӂ
  Ă܂B 2.4 nł́AvZX𓯂vZbTɂȂׂ
  悤ɃXPW[O@ύXĂ܂B܂vZbTEoC
  fBÓA荞݂ɂĂ͎ĂAvZXɂĂ͌
  łz

  rIȃVXȇ́A1  L2 LbV 2  Pentium v
  ZbTŋLĂ܂BƂɃLbV̋āA
  ̓ƗvOɑ΂Đ[ȃptH[}X̒ቺ
  N܂Btɗǂ_́AvȎۂɋL
  LbV̉b󂯂\邱ƂłBƂ̂́Ãv
  ZbTL̓CɃANZX悤ƂꍇALbV
  f[^tFb`Ȃ΂ȂȂ̂ 1 ̃vZbTŁAoX
  ܂BvZbTEAtBjeBȂ΁AL L2
  LbṼf[^sႭ邱Ƃł܂B܂񏈗
  ɂƂāA\zĂقǁAL L2 LbVɌ_Ƃ͒f
  ܂B

  BLĂ 2  Pentium 𓋍ڂ 256 K ̃LbV
  VXegpo炷ƁAptH[}Xɔɂ΂
  Ǎ̓J[l̃xɈˑĂ܂BňŖ 1.2
  {̑xɂȂ܂B 2.1 {܂ōłƂ
  AvZS SPMD X^C̃R[h͂܂ɁutFb`̋Lvʂ
  Ă邱ƂɂȂ܂B

  2.1.2.  oX̍\H

  ŋ߂̑啔̃VXeł́AvZbT 1 ȏ PCI oXڑ
  āA PCI oX 1 ȏ ISA  EISA oXuubWvĂ
  ܂B̃ubWxNA EISA  ISA  PCI 
  ׂđшȂ܂(ISA łx)B̂߃fBXNhCur
  fIJ[h̍ptH[}XKvƂfoCX́A PCI oX
  C^tF[XoRŐڑׂłB

  MPS VXeł́APCI oX 1 ȂĂvZ߂v
  OɎsł܂Bo͏́AvZbT 1 
  ̂ǂƂ͌܂c炭vZbTɂoX̋Ŏ኱p
  tH[}XĂ܂܂B܂o͂̑xɒڂƂ
  ΁A̓Ɨ PCI oXƓo̓Rg[ MPS VXe
  ɓǂƂƂɂȂ܂(ႦΕ SCSI ڑ)BŒ
  ӂȂ΂Ȃ̂́ASMP Linux ȂL镔iT|[g
  Ă邩AƂƂłB܂ŐV SMP Linux {IɃJ[l
  ͏ 1 ̃vZbTĂȂƂƂYȂł
  BŁAo̓Rg[ɂ͓o͏ꂼɕKvƂȂ
  J[l̏Ԃŏ̂̂IԂ悤ɐSĂB{ɍ
  \ڎwȂ΁AVXeR[gȂŁA[UEvZX璼
  raw foCXgēo͂邱ƂlĂ̂ł͂Ȃł傤
  B͎vقǓƂł͂܂񂵁AZLeBx
  邱ƂɂȂ܂(ZNV 3.3 Ŋ{IȂ܂)B

  oX̑ƃvZbT̃NbN̑̊֌WNłтɂȂ
  邱ƂВmĂĂBł̓VXȇ啔͓
  PCI ̃NbNxgpĂ܂AȃvZbT̃NbNƒᑬ
  ȃoX̃NbN̑ǵA܂ȃP[XƂ͌܂BPentium 133 
  Pentium 150 葬oX̗pĂAlXȃx`}[Nňꌩsvc
  ȌʂoĂ̂ǂłB̉e SMP VXeł͂
  ɑ傫Ȃ܂B葬oXENbNdvȂ̂łB

  y󒐁FPentium 133  66 MHz  2 {APentium 150  60 MHz  2.5
  {ŋ쓮܂z
  2.1.3.  ̃C^[u DRAM ̋ZpH

  {AC^[u邱Ƃ MPS Ƃ͉̊֌W܂񂪁A
  MPS VXeł͂悭GbłBƂ̂ÃVXe͉
  Xɂă̑ш敝KvƂ邩łBʂ́A2 way 
  4 way C^[u RAM \܂B̂߃ubNEANZX
  ́A 1 ̃oNł͂ȂÃoNgp܂Bɂ
  āALш敝ŃɃANZXłAƂ킯LbṼ[h
  XgAɌʂ܂B

  y󒐁FC^[uƂ́Ãf[^ǂݏ̍͂邽
  ̕@ 1 ŁAڂĂ郁O[v܂B̃O[
  voNƌĂсÃoNPʂɕɃANZXƂ܂B 2
  way  2 oNA4 way  4 oNɃO[vɕĕɃAN
  ZX܂z

  ̌ʂɂẮA󋵂XׂƂĂ܂B̗ŔA
  EDO DRAM Ƒ̗lXȃ֘AZp悤Ȏނ̑ɉǂ
  ĂĂ邽߂łBDRAM ZpɂĂƂĂ悭܂Ƃ߂ꂽA
  <http://www.pcguide.com/ref/ram/tech.htm> Ō܂B

  ł́A2 way ŃC^[uĂ EDO DRAM ƃC^[uĂ
   SDRAM ł͂ǂ炪ptH[}XDĂł傤H ̎
  ƂĂȂ̂łAȒPɂ͓炦܂BƂ̂AC^
  [ûA͂ DRAM ZpAƂĂɂȂ肪łB
  ĕʂ̃w΁A葽̃mۂł
  ͖̂炩łBԒx DRAM łAfBXNx[X̉z
  ̂ɂȂȂقǍłcB

  y󒐁FSDRAM  EDO RAM ̑傫ȈႢ́ASDRAM  PC ̃x[XNbN
  Ɠē삷̂ɑ΂āAEDO RAM ̓x[XNbNƂ͔񓯊ɓ
  _ɂ܂B SDRAM ͂߂̃AhXɂf[^ɃANZ
  X鎞ɂ EDO DRAM Ɠlɒx(RASACAS)܂Bチ
  ƌ RDRAM Lш敝ł܂ADRAM gp
  邱Ƃɂ͂ȂA͂xĂ܂܂B܂A݂
  ł̃̍̓o[Xg[h̍SłāA DRAM ̂
  Ăx̖{IɌĂ킯ł͂܂z

  2.2.  LgvO~O͂߂ɂ

  낻񏈗 SMP œƂAɑf炵𗝉ł
  Ǝv܂cBǂ͂߂炢ł傤H ܂͋L
  Mۂɂǂ̂悤ɓ̂A΂׋Ă݂܂傤B

  vZbTlɃXgAāAvZbT[h
  \ƒPȂƂɎv邩܂񂪁AcOȂ炻ق
  Pł͂܂BႦ΁AvZXƃvZbT̊֌W͂茈
  킯ł͂܂BAvZbŤȏɃvZX
  ȂȂAvZXƃvZbTƂtꊷĂ܂ĂA
  ςɌēƂłB̃ZNV̎c̕ł́A傫Ȗ
  ɂȂƎvL[|CgTςāA|CgO܂܂ɂȂȂ
  悤ɂƎv܂BLׂ߂̂Ɏg郂f 2
  ƁAAg~bNȑAϐ̕ۑ̂An[hEFÃbNA
  LbVEČʁALinux ɂvZX̃XPW[O
  ܂B

  2.2.1.  ׂĂL̂AꕔL̂

  LgvO~Oɂ́A{IɈقȂ 2 ̃f
  ܂Bׂ͂ĂLꍇƈꕔLꍇłB 2 
  fƂAvZbTL͋Lփ[hXg
  AĂƂł܂BႤƂ́AׂĂLꍇf[^\
  ׂĂLɒûɑ΂āAꕔLꍇ́A[U
  ͂Ƃǂ̃f[^\Lgp\Aǂ̃f[^
  \PvZbT̃[Jȃgp邩Kv
  B

  ǂ̋Lfgׂł傤H Ă̏ꍇ͍D݂
  ƌĂƎv܂BׂĂL郂fDސlX
  ́Af[^\̂ǂꂪ錾ꂽ̎ɋLׂAƂƂ
  ʂKv܂ȂłBȃANZXɃbN
  āALĂ̂ 1 ̃vZX(vZbT)炵ꎞɃA
  NZXȂ悤ɂ܂BJԂ܂AL̂悤ɒPȂ킯
  ł͂܂BŁArISł鋤L̂ꕔɂƂǂ߂
  @IԐlX̂łB

  2.2.1.1.  ׂĂL

  ׂĂL闘_́Aɂ鏇svO₷ɓ邱
  ƁAẴvOׂĂL邱ƂOɂvO
  ɁAقǎԂCĂ_ɂ܂Bǂ̃f[^
  vZbTɂăANZX邩ŏKv͂܂B

  ȒPɌƁAׂĂLő傫ȖƂȂ̂́AvZbT
  ƂׂẴvZbTɉe^Ă܂Ȃ_
  ɂ܂B̖肪ɂȂP[X 2 ܂B

  o  Cȗ́Af[^\L邱ƂOɂĂȂB
     Ⴆ΁AUNIX ̊KƂĊ֐̑ errno ƌĂ΂ϐŃG
     [ER[hԂBׂĂLĂ 2 ̃vZXAlXȃV
     XeR[𔭍sꍇA errno LĂ܂A݂Ɋ
     Ă܂ȂB݂ł͂ errno ̖C
     o[W̃Cu邪A悤Ȗ͈ˑRƂđ啔
     CuɎcĂBႦ΁AʂȏuȂƕׂ̂Ă
     LvZX X CuĂł삵Ȃ̂ł

  o  ʏň̃P[XƂȂ铮́AvO|C^z̗\
     Ă܂ÂȃR[h܂񂾃vZXł܂
     łBƁA炭 core t@CłāAN
     ̎|肪BׂĂL񏈗̏ꍇ́AsȃAN
     ZXɂāAȃvZXȊÕvZXł܂
     AG[肵AC肷邱ƂقƂǕs\ɂȂ

  L̗ނ̖́AꕔL@Ƃꍇɂ͂قƂǋN܂
  B́A͂Ǝw肵f[^\L邽߂łB܂A
  ׂĂL@삷̂́AvZbTׂĂSE
  C[WsĂꍇłB͂قƂǋ^]nȂƂ
  BׂĂLĕ̈قȂR[hEC[WƂ͂ł܂
  (܂ASPMD ͗pł܂AMIMD ͂ł܂)B

  ׂĂLꍇɃvOT|[gT^Iȃ^CvAXb
  hECułBThreads
  <http://liinwww.ira.uka.de/bibliography/Os/threads.html> ́A{uy
  (light-weight)vȃvZXƂāAʏ UNIX ̃vZXƂ͈
  XPW[œ삵Ă܂BłƂĂ؂Ȃ̂́A1 ̃E
  }bvLăANZX_ɂ܂B POSIX Pthreads
  <http://www.gnu.ai.mit.edu/software/pth/> ̃pbP[ẂAڐAɑ΂
  ւȘJ͂𒍂ł܂BŔɋ^Ȃ̂́AڐAꂽ
  { SMP Linux ̃vÕXbhƂĕɓ삷̂A
  ƂƂł(zIɂ́AvZbTłꂼ̃Xbh삷
  )BPOSIX API ́A܂ł߂Ă܂񂵁A
  <http://www.aa.net/~mtp/PCthreads.html> y󒐁FN؂ẑ悤
  o[ẂAXbhɎs邱Ƃ܂lĂ܂B
  vOsXbhׂ͂āALinux  1 ̃vZX
  ܂B

  SMP Linux ̕񏈗ŏɃT|[gXbhECúAɉ
  ̂̂ɂȂ bb_threads CuŁA
  <ftp://caliban.physics.utoronto.ca/pub/linux/> ɂ܂B͂Ƃ
  K͂ȃCu Linux  clone() VXeR[gAVɎq
  vZX𗧂グœƎ̃XPW[œ܂Bł Linux
  ̃vZXׂĂ 1 ̃AhXԂL܂B SMP Linux }V
  ́ÁuXbhv𕡐sɓ삷邱Ƃł܂BR͊eX
  ́uXbhv Linux ̃vZXɑȂȂłBƈ
  ɁÃIy[eBOEVXe񋟂Ă邢̃XbhE
  Cû悤ȁuyʂȁvXPW[͂ł܂B̃Cu
  ́AC Ńbp[AZuER[h܂܂ĂāAɂ
  ꂼ̃Xbh̃X^bN̈mۂAAg~bNȃANZX@\b
  N̔z(~[ebNAmutex)Ŏ܂BhLǵAREADME ƒZ
  TvEvO܂B

  ŋ߂ɂȂāAclone() g POSIX XbhJĂ܂B
  Cu LinuxThreads
  <http://pauillac.inria.fr/~xleroy/linuxthreads/> ŁASMP Linux Ŏgp
  邱ƂOɂĂׂĂL邱ƂړIɂCu
  BPOSIX Xbh̓hLgĂALinuxThreads README
  <http://pauillac.inria.fr/~xleroy/linuxthreads/README>  LinuxThreads
  FAQ <http://pauillac.inria.fr/~xleroy/linuxthreads/faq.html> ͂ƂĂ
  ǂłBł̎Ȗ́APOSIX Xbh͓eɔẐ
  ߂ɁAƂ̓e𗝉Kv邱ƁALinuxThreads ͊Jr
  ł邱ƂłB܂APOSIX XbhKíAWƒƂ
  AÂȂKȉo[Wō쐬Ȃ悤ɏXӂKv
  B

  y󒐁FPOSIX Xbh IEEE 1003.1 ƂĕWĂ܂BeX
  bhCuɂĂ Multithreading Libraries
  <http://www.gnu.org/software/pth/related.html>A}`Xbh̃vO
  ~OɂĂ̓}`Xbh̃vO~O
  <http://docs.sun.com/ab2/coll.141.7/MTP/@Ab2TocView?Ab2Lang=ja&Ab2Enc=shift_jis>
  ɗ܂z

  2.2.1.2.  ꕔL

  ۂ̂ƂꕔLƂƂ́AuLKv̂
  LvƂƂłB̃Av[`́AʓIɂ MIMD(SPMD ł
  Ȃ) ɍvĂāAꂼ̃vZbT̃E}bvœʒu
  ɂ鋤LIuWFNg_ɒӂKvƂȂ܂BƑ؂
  ̂́AꕔL邱ƂŃptH[}X̗\ƉPR[h̃fobN
  ȒPɂȂ邱ƂłBɂȂ̂́A

  o  {ɋLׂȂ̂OĒm邱Ƃ

  o  ہALɊtꂽIuWFNg͈Â炭AɃX
     ^bNɂIuWFNg͂ȂłBႦ΁ALIu
     WFNǵAꂼƗZOgɂƔzuK
     v邩ȂAꂼ̃ZOgɔzuƂ
     ꂼ̎QƏ̒ɂɗ]ɊԐړIȃ|C^i[Kv
     邩Ȃ

  ł́ALinux ̃vZXO[vƗԂɒûɔ
  @ 2 ܂BLׂ̂ẮÃԏ
  ł͂ق̂킸ȃZOggp邾łBLinux VXeݒ肷
  鎞ɁuSystem V IPCvOĂ܂Ȃ΁A Linux 
  uSystem V Shared Memory(L)vƂƂĂڐA݂
  pł悤ɂȂ܂B̑IƂẵ}bsO@\p
  A͂낢 UNIX VXeԂłꂼĂ܂Bꂪ
  mmap() VXeR[łB}jȂł̃VXeR[
  wK邱Ƃ߂܂BȒPȊT̓ZNV 2.5  2.6 ŐG
  ܂̂ŁA׋邫ƂėpĂB

  2.2.2.  Ag~bNȏƏ̏

  Lǂ̃fgɂĂAʂ͂قǈႢ܂Bv͕v
  O̒AׂẴvZbTANZXłǂݏ\ȃ
  ̈ꕔւ̃|C^𓾂킯łBꂪӖƂ́AL
  ̃IuWFNgANZXvOÃIuWFNg[
  Jȃɂ邩̂ƂAƂƂȂ̂ł傤HƂ
  ̂łAƈႢ܂c

  Ag~bNȏƂ̂́AΏۂɑ΂鑀𕔕ɕA
  ݂肷邱ƂȂAAďlłBcOȂ狤
  L̃ANZXł́ALɂf[^ɑ΂邷ׂĂ̑삪
  Ag~bNɍs킯ł͂܂BłȂAP
  [hXgÂ悤ȃoXł̏ 1 ōςޑ (
  A8A16A32 rbgɃACꂽBACĂȂA
  64 rbg͈̑قȂ)AAg~bNȏɂȂ܂Bɓs
  ƂɁAGCC ̂悤ȁuvRpCł͍œKĂ܂A
  vZbT̏Ƃ𑼂̃vZbTm̂ɕKv
  Ȃ郁̑菜Ă܂łBKȂƂɂ́A
   2 ƂP邱Ƃł܂BCɂȂANZX̌ƃLb
  VEC̑傫̊֌Ŵ܂܂ɂĒûłB

  ̖__OɁAꂼ̃vZbTQƂ
  鎞ɂ́AOƂăR[fBOԂŎQƂƂƂ͂
  ĂƂ͖ʂł͂܂BPentium łA Intel
  ̃vZbTłƂ͌ȂAƂƂYȂłB
  ̂悤Ȃ킯ŁACɎ~߂Ăė~Ƃ܂B͏̃v
  ZbTAۗĂ郁ւ̃ANZX閽߂ʂċL
  ɃANZXKvoĂ邩ȂAƂƂłB
  Aւ̃ANZXɏԂt@\񋟂킯łBCPUID 
  ́A̖߂ɂĐ鈫eɑ΂Ă̗\huł邱Ƃ͖炩
  B

  2.2.3.  ϐ̕ۑ̂

  WX^ɂ鋤L̃obt@ĂIuWFNg̒l GCC 
  œKȂ悤ɂɂ́ALׂ̂Ă̎̂ volatile Ƃ
  Đ錾Kv܂B錾ƁALIuWF
  Ngɑ΂ 1 [h̃ANZXƂȂǂݏ́AAg~bN
  s܂BႦ΁Ap ւ̃|C^Ń|C^ƐL
  ɂƂƁAANSI C ł̐錾͎̂悤ɂȂ܂B

  ______________________________________________________________________
  volatile int * volatile p;
  ______________________________________________________________________

  ̃R[hł́Aŏ volatile  int QƂA int  p w
  Ă܂B volatile ́A|C^̂̂QƂĂ܂B
  ̂łÂƂwŁAGCC ŋ͂ɍœK
  Ƃ\ɂȂ܂BȂƂł́AGCC ɑ΂ -traditional
  IvV邱ƂŁAœKԂ]ɂĐR[hԈ
  ȂłƎv܂BƂ̂́AANSI ߂O K&R  C
  ́A register ƈӐ}IɎwȂAׂĂ̕ϐ
  volatile ɂĂ܂BGCC ŃRpCꍇ cc -O6 ... 
  lɂĂȂA{ɕKvȕɂ͂͂ volatile Ǝw肵
  ȂɈႢ܂B

  vZbTׂ̂ẴWX^XVꂽƂm点ڂłAZ
  ũbNgƁAGCC K؂ɂׂĂ̕ϐtbVāA
  volatile Ɛ錾ƂɊ֘AR[huvɃRpC
  ƂhAƂ\܂B̗ŹAGCC ̃o[W 2.7.0 
  g static ŊmۂOϐɑ΂Čʂ𔭊܂c
  ANSI C Wɉ@\ł͂܂񂵁AȂ܂Ƃɓǂݍ݂
  s̃vZbT́AWX^ɂƒlobt@Ă܂܂B
  ܂AL̒lύXĂ邱ƂSm悤܂B
  ܂Ƃ߂ƁA]݂̓sɂ volatile gĕϐɃANZX邵
  삷邱Ƃۏ؂ȂAƂƂłB

  ʏ̕ϐɑ΂ volatile w肵ă^CvLXg邱
  ŁAvolatile ȃANZXsƂƂ𗝉ĂĂB
  ΁Aʏ int i;  *((volatile int *) &i) Ƃ邱ƂŁAvolatile
  ɎQƂł悤ɂȂ܂B܂Advȕɑ΂ĂuI[o[
  wbhvƂȂ volatile ȑӐ}ČĂяoƂł܂B

  2.2.4.  bN

  ++i; ALɂϐ i ɏ 1 ƎvĂȂA
  uȂ񂾁ÁvƂԂɂȂ܂BPȖ߂s悤ɃR[
  fBOĂĂA[hXgA͌ʓIɓƗăɑ΂閽
  ߂𔭍sÃvZbT i ɑ΂邱 2 ̖߂̊ԂɃANZX
  Ă܂܂BႦ΁A2 ̃vZX҂ ++i; sƁAi
   2 ̂ł͂ȂA 1 邱ƂɂȂ邩܂BIntel ɂ
  Pentium ́uArchitecture and Programming ManualvɂƁALOCK Ƃ
  PꂪɂĂƁǍɂ閽߂łĂÃf[
  ^ւ̃ANZXɊ֘A鑀̓Ag~bNł邱Ƃۏ؂Ă܂B

  ______________________________________________________________________
  BTS, BTR, BTC                     mem, reg/imm
  XCHG                              reg, mem
  XCHG                              mem, reg
  ADD, OR, ADC, SBB, AND, SUB, XOR  mem, reg/imm
  NOT, NEG, INC, DEC                mem
  CMPXCHG, XADD
  ______________________________________________________________________

  ̖߂SʓIɍ̗p邱Ƃ́AǂvtƂ͂Ȃ
  傤BႦ΁AXADD  386 vZbTł͎gpł܂̂ŁAڐA̖
  Ŗ肪Ă܂ł傤B

  XCHG ߂́ALOCK ƂPꂪɂĂȂĂɃbN܂
  A̕@͖炩ɃAg~bNȑƂāA荂ȃAg~bN̂
  ݂łZ}tHL[̋LDĂ܂B C ŃR[
  fBÔ GCC ɂĂA̖߂͐ł܂ĉ
  ɁA΂CCŃAZuER[h̋LqKvɂȂ
  B1 [h volatile ȃIuWFNgł obj Ƃ͂ 1 [h̃
  WX^lł reg `ƁAGCC ̃CCł̃AZuER[
  h͉L̂悤ɂȂ܂B

  ______________________________________________________________________
  __asm__ __volatile__ ("xchgl %1,%0"
                        :"=r" (reg), "=m" (obj)
                        :"r" (reg), "m" (obj));
  ______________________________________________________________________

  GCC ̃CC̃AZuER[hŁArbggăbN
  ́Abb_threads library
  <ftp://caliban.physics.utoronto.ca/pub/linux/> ɂ܂B

  AڂĂė~Ƃ܂B̓Ag~b
  NɍsƁAȂɃRXgƂƂłBbN鑀
  ͂Ȃ傫ȃI[o[wbhAʏ̎QƂ[JȃLbV
  𗘗p̂ɔׁÃvZbT̃QƂ͒xĂ܂
  ƂɂȂł傤BœKȃptH[}X𓾂ɂ́Ał邾bN
  gpȂƂłB܂A IA32 ł̃Ag~bNȖ߂́AR
  ł̃VXeɂ͈ڐAł܂B

  ̑ɂ@͂낢날܂Bʏ̖߂ɑ΂āA낢
  ƂƂ邽߂̎pӂĂ܂B̒ɂ ݔr
  (mutual exclusionB mutex))AȂƂ 1 ̃vZbT
  łLĂIuWFNgXVł邱Ƃۏ؂Ă܂B
   OS ̃eLXgł́ÃeNjbN̓̂_Ă
  BAbraham Silberschatz   Peter B. Galvin ̋łA
  Operating System ConceptsAISBN 0-201-50480-4 ̑ 4 łŔɗDꂽ
  c_ȂĂ܂B

  2.2.5.  LbVEC̑傫

  Ag~bNȑɊւĕK{ŁASMP ̃ptH[}XɌIȉe
  邱Ƃ 1 ܂B̓LbVEC̑傫łB
  MPS Kił̓LbVgĂĂȂĂA邽߂̎QƂ
  KvƂĂ܂B 1 ̃vZbT̂郉Cɏ
  ݂sƁAȑO܂ꂽCɂLbVĂ̂́A
  ׂĂ𖳌ɂ邩XVKv܂B2 ȏ̃vZbTǂ
  f[^𓯂C̈ႤɏƂƁALbVoXɑʂ
  肪Ă܂܂B͎LbVEC
  nN邱ƂӖĂ܂B̖́AUL(false
  sharing) ƌĂ܂B̂͂ĒPŁAɃANZX
  ꍇ́Aꂼ̃vZXɑ΂āAf[^ł邾قȂLb
  VECĂ悤Ƀf[^\邱ƂłB

  UĹACPU ʂĎgp L2 LbVĂVXeɂ
  ֌WȂƎv邩܂񂪁AƗđ݂ L1 LbV
  YĂ͂܂BLbV̍\Ɨx̐͗҂Ƃ
  ̂ŁAPentium  L1 ̃LbVEC̑傫 32 oCg
  OLbVEC̓T^Iȑ傫 256 oCgxłB 2 
  ̗vf̃AhX(Azǂł) a  b ƂāAvZbT
  ő̃LbVEC̑傫 c ƂĂꂪ 2 ̗ݏ̑傫Ƃ
  ܂BɌƁA ((int) a) & ~(c - 1)  ((int) b) & ~(c - 1)
  Ɠ΁AǂLbVECQƂ邱ƂɂȂ܂B
  LIuWFNgɎQƂꍇAȂƂ c oCgꂽ
  ʒuɂȂ΁AقȂLbVECɒuׂAƂ̂
  łB

  2.2.6.  Linux ̃XPW[̖_

  񏈗ŋLgpۂɂ́A镔 OS ̃I[o[wb
  hȂ΂܂񂪁AOS ̃I[o[wbh͒ʐMꎩ̈ȊO
  Ƃ납甭\܂Bɂ܂łɏqׂĂ܂Av
  ZX̐̓}VɕtĂvZbTȉɂ悤ɍ\ׂ
  BłǂēvZX𐳊mɌ߂̂ł傤H

  ō̃ptH[}X𓾂ɂ́AvOœvZX́A
  ̃vOŋNvZXɈقȂvZbTœƎv
  鐔ƓɂׂłBႦ΁A4 ̃vZbT SMP VXe
  ł́Aʏ 1 ̃vZbT͉ʂ̖ړI(Ⴆ WWW T[o)Ɏg
  ƂƁA3 ̃vZbTŕvO𓮂ƂɂȂ
  łB܂ɂǂ̂炢̃vZXVXeŃANeBuȂ̂́A
  uptime R}hŌuload average(ϕ)v΂킩
  B

  Ƃ͂܂ʂ̕@AvOŎgĂvZX̎sD
  揇ʂグ邱Ƃ\łBႦ΁Arenice R}h nice() V
  XeR[łBDxグɂ́AKvɂȂ܂B̃AC
  fBA͒PŁÃvZXvZbTǂoāÃvZX
  ׂẴvZbTœɓĂ܂ƂlłB̍l
  vg^Cvł SMP Linux gpĂƎ̂
  <http://www.rtlinux.org/> ŁAA^CȃXPW[O񋟂
  ܂B

  SMP VXe񏈗}Vlň[UłȂȂA2 ȏ
  ̕vO𓯎Ɏs悤ƂƁAvOԂŏՓ˂N
  ꂪ܂Bʂ@́AMOXPW[O
  (gang scheduling)Ƃ܂BȂ킿AXPW[O̗Dx𑀍
  āAł 1 ̕vOɊւvZXĂ
  悤ɂ܂BvoĂ݂ĂBss΍sق
  ʂ𓾂ɂȂAXPW[ɃI[o[wbh܂B
  Ⴆ΁A4 ̃vZbT}VAXPW[g 2
  ̃vOꂼ 4 ̃vZXœA2 ̃vO
  ꂼ 2 ̃vZXœǂ̂͊młB

  ɂ 1 ̖₱Ă鎖܂B}V
  vOJĂāÃ}V͏IƂĂZĂ邪A
  Ԃ͕񏈗ɊہXgƂ܂BvZXׂĂ𗧂グĐ
  悤ɃR[hāAeXgȂ΂܂񂪁AԂ̃eXg
  ͒xƂvm炳Ǝv܂B̂ƂƂĂxȂ܂B
  ݓĂȂ(̃vZbT)̃vZXύXL
  ̒lrW[EGCgĂvZXȂ΁Bĺ̖Av
  ZbT 1 ȂVXeŃR[hJeXg肷鎞
  N܂B

  @́AR[hɌĂяogݍނƂłBǂȏꍇłÃv
  ZX̓[vgđ҂悤ɂ܂B Linux
  ́ÃvZX@^邱Ƃł܂B C ̃}N
  g IDLE_ME ̂悤ɌĂяoĂ܂BeXgœɂ́Acc
  -DIDLE_ME=usleep(1); ... ƃRpCAuivƂēꍇɂ
  cc -DIDLE_ME={} ... ƃRpCĂ܂Busleep(1) ĂяoƁA1
  ~bԃX[v悤ɂȂALinux ̃XPW[̃vZbT
  ŕʂ̃vZXIׂ悤ɂȂ܂BvZXgp\ȃvZbT
  2 {ȏ̐ɂȂƁAR[h̒ usleep(1) gƁAgȂꍇ
  10 {Ȃ邱Ƃ܂B

  2.3.  bb_threads

  bb_threads (uBare Bonesv(KvŒ) threads)CúA
  <ftp://caliban.physics.utoronto.ca/pub/linux/> ɂɊȑfȃC
  ułBLinux  clone() VXeR[gĎĂ
  Bgzip tar t@Cł 7 KB łI ̃CúA2.4 Ř_
   LinuxThreads CuɏoƂŉߋ̂̂ɂȂĂ܂܂
  Abb_threads ͂܂܂ɗ܂BAVvŁAƂ肠
  ŏ Linux ̃Xbhgpɂ͏\łB̃\[XER[h
  ǂłALinuxThreads ̃\[X𒭂߂̂悤ɈЈ邱Ƃ
  Ȃ̂͊młB܂Ƃ߂Ă݂ƁA bb_threads Cu͍ŏɎ
  ݂̂ɂ͗ǂCułAȂƂ傫ȃvWFNg̃R[
  fBOŎgp̂ɂ͓KĂ܂B

  bb_threads Cug{IȃvO̍\z@́AL̒
  łB

  1. vÓA1 ̃vZXƂăX^[g邱

  2. ꂼ̃XbhŕKvɂȂX^bNԂ̍őlς邱ƁB
     ςĂQ͂Ȃ(zLł悤 ;-)BY
     ŗ~Ƃ́AX^bNׂĂ͒PƂ̉zAhXԂɗR
     邽߁A傫Ƃ͂ƂAƂ킯ɂ͂ȂƂł
     B64 K ̑傫łB bb_threads_stacksize(b) Ƃ
     ƁA b oCgɐݒł

  3. ̃Xebv́AKvƂȂ邷ׂẴbN邱ƂłB
     bN݂̂͂̃Cuɑgݍ܂ĂāA0 
     MAX_MUTEXES ܂ł̔ԍݒłAi ƂbN
     ́Abb_threads_mutexcreate (i) Ɛݒ肷

  4. VXbhNɂ́ACũ[`Ăяoĉ̊
     XbhƂĎsÅ֐ɓn͉w肷B
     VXbhJnɂ́Avoid ԂlƂ֐ł f P
     Ƃ arg ƂĎKvA bb_threads_newthread(f, &arg)
     ƂŎw肷邱ƂɂȂB f  void f(void *arg,
     size_t dummy) Ƃ悤ɐ錾ĂׂłB 1 ȏ
     Ȃꍇ́A̒lŏĂ\̂ւ̃|C^w肵Ă
     

  5. R[hsBsɓẮA bb_threads_lock(n) 
     bb_threads_unlock(n) TdɎgp邱ƁBn ͐ŁAǂ̃bN
     gp邩w肷B̃Cuł̃bN邱ƂƃbN
     鑀́AAg~bNɃoXbN閽߂gāA
     ꂽXsEbNŎĂB̕@ł͕KvȏɃQ
     tsAvZXɎs邱Ƃۏ؂łȂ

     bb_threads ɂĂfEvO͐bNA
     printf()  fnn  mainȂǂ̊֐œɎsĂ܂B̂
     Ȃ킯ł̃f͏ɓƂ͌ȂBf͂
     AbNɂ͍אS̒ӂKvł邱ƂĂB
     ALinuxThreads g΂킸ł͂邪g₷Ȃ邱Ƃt
     

  6. XbhԂl߂_ŁÃvZXۂɔjc
     A[JȃX^bNE͎IɉȂBmɌ
      Linux ̓̉T|[gĂ炸ÃԂ
     malloc() ̃̋󂫃XgɎIɖ߂ȂB܂AevZ
     X bb_threads_cleanup(wait(NULL)) ĂяoāAł܂q
     vZX̃Xy[Xėp̂߂ɍĐ錾Ȃ΂Ȃ

  L C vO̓ZNV 1.3 Ř_ASYɁA2 
  bb_threads gĉ~̋ߎl߂Ă܂B

  ______________________________________________________________________
  #include <stdio.h>
  #include <stdlib.h>
  #include <unistd.h>
  #include <sys/types.h>
  #include <sys/wait.h>
  #include "bb_threads.h"

  volatile double pi = 0.0;
  volatile int intervals;
  volatile int pids[2];      /* Unix PIDs of threads */

  void
  do_pi(void *data, size_t len)
  {
    register double width, localsum;
    register int i;
    register int iproc = (getpid() != pids[0]);

    /* set width */
    width = 1.0 / intervals;

    /* do the local computations */
    localsum = 0;
    for (i=iproc; i<intervals; i+=2) {
      register double x = (i + 0.5) * width;
      localsum += 4.0 / (1.0 + x * x);
    }
    localsum *= width;

    /* get permission, update pi, and unlock */
    bb_threads_lock(0);
    pi += localsum;
    bb_threads_unlock(0);
  }

  int
  main(int argc, char **argv)
  {
    /* get the number of intervals */
    intervals = atoi(argv[1]);

    /* set stack size and create lock... */
    bb_threads_stacksize(65536);
    bb_threads_mutexcreate(0);

    /* make two threads... */
    pids[0] = bb_threads_newthread(do_pi, NULL);
    pids[1] = bb_threads_newthread(do_pi, NULL);

    /* cleanup after two threads (really a barrier sync) */
    bb_threads_cleanup(wait(NULL));
    bb_threads_cleanup(wait(NULL));

    /* print the result */
    printf("Estimation of pi is %f\n", pi);

    /* check-out */
    exit(0);
  }
  ______________________________________________________________________

  2.4.  LinuxThreads

  LinuxThreads( <http://pauillac.inria.fr/~xleroy/linuxthreads/>)
  ́APOSIX 1003.1c ̃XbhWKiɊÂāuׂĂLv
  \ȂƎĂ܂B POSIX ̃XbḧڐA
  ƈႢALinuxThreads ̓J[l̃Xbh@\(clone())gĂA
   bb_threads ƓlȎ@ƂĂ܂BPOSIX ݊ƃXbh
  gAvP[V𑼂̃VXeֈڐA邱ƂXbhƔׂ
  ȂeՂɂȂA`[gAނ낢뗘pł܂B
  ALinux őK͂ɃXbhꂽvOJȂAԈႢ
  ̃pbP[WK؂łB

  LinuxThreads Cug{IȃvO̍\ẑ́A
  L̒ʂłB

  1. vÓA1 ̃vZXƂăX^[g邱

  2. ̃Xebv́AKvƂȂ邠郍bN邱ƂłB
     bb_threads ̃bNԍw肷̂Ƃ͈قȂA pthread_mutex_t
     lock Ƃϐ錾̂ POSIX ł
     Bpthread_mutex_init(&lock,val) gāAKvȂꂼ̃Xb
     h

  3. bb_threads ƓlɁAVXbhNɂ̓Cũ[`
     ĂяoÅ֐XbhƂĎsÅ֐ɓn
     ͉w肷BAPOSIX ł̓[U pthread_t Ƃϐ
     錾ăXbhʂBXbhNɂ́Apthread_t thread
      f() 𓮂ɂ́Apthread_create(&thread,NULL,f,&arg) Ăяo

  4. R[h𓮂ɂ́A pthread_mutex_lock(&lock) 
     pthread_mutex_unlock(&lock) K؂ȂƂŐTdɎgp邱

  5. pthread_join(thread,&retval) gāAXbȟn邱

  6. C ̃R[hRpC鎞ɂ́A-D_REENTRANT g

  ɂ̂́A~̌vZ LinuxThreads gĕɍsłB
  ZNV 1.3 ŎgASYgpĂāAbb_threads Ɠl
   2 ̃XbhɎs܂B

  ______________________________________________________________________
  #include <stdio.h>
  #include <stdlib.h>
  #include "pthread.h"

  volatile double pi = 0.0;  /* Approximation to pi (shared) */
  pthread_mutex_t pi_lock;   /* Lock for above */
  volatile double intervals; /* How many intervals? */

  void *
  process(void *arg)
  {
  register double width, localsum;
  register int i;
  register int iproc = (*((char *) arg) - '0');

  /* Set width */
  width = 1.0 / intervals;

  /* Do the local computations */
  localsum = 0;
  for (i=iproc; i<intervals; i+=2) {
  register double x = (i + 0.5) * width;
  localsum += 4.0 / (1.0 + x * x);
  }
  localsum *= width;

  /* Lock pi for update, update it, and unlock */
  pthread_mutex_lock(&pi_lock);
  pi += localsum;
  pthread_mutex_unlock(&pi_lock);

  return(NULL);
  }

  int
  main(int argc, char **argv)
  {
  pthread_t thread0, thread1;
  void * retval;

  /* Get the number of intervals */
  intervals = atoi(argv[1]);

  /* Initialize the lock on pi */
  pthread_mutex_init(&pi_lock, NULL);

  /* Make the two threads */
  if (pthread_create(&thread0, NULL, process, "0") ||
    pthread_create(&thread1, NULL, process, "1")) {
  fprintf(stderr, "%s: cannot make thread\n", argv[0]);
  exit(1);
  }

  /* Join (collapse) the two threads */
  if (pthread_join(thread0, &retval) ||
    pthread_join(thread1, &retval)) {
  fprintf(stderr, "%s: thread join failed\n", argv[0]);
  exit(1);
  }

  /* Print the result */
  printf("Estimation of pi is %f\n", pi);

  /* Check-out */
  exit(0);
  }
  ______________________________________________________________________

  2.5.  System V ̋L

  System V  IPC(vZXԒʐM(Inter-Process Communication))́AVXe
  R[𐔑񋟂Ă܂BbZ[WEL[Z}tHAL
  Ƃ݂łB{݂̂́ÃvZXvZb
  T 1 ̃VXeœƂړIƂĂ܂BASMP Linux
  ŕ̃vZXԂł̒ʐMɂg͂łBƂǂȃvZbT
  ĂB

  ̃VXeR[̎g̐ɓOɁASystem V  IPC Ɋ܂
  ĂZ}tH⃁bZ[WʐM̂悤ȃVXeR[gpׂł
  ȂƂ𗝉ĂĂBǂĂł傤H SMP Linux ł
  ̋@\͊TďxAs邩łB͂ŏ\
  łˁB

  L̃ZOgɈlɃANZX邽߂ɁAvZX̃O[v
  쐬{IȎ葱͎̒ʂłB

  1. vÓA1 ̃vZXƂăX^[g邱

  2. ʁAꂼ̕񏈗̃vŐL̃ZOg
     gēƎv̂ŁȀꍇ shmget() ĂŕK
     vȑ傫̃ZOgV쐬B܂̃VXeR[́A
     ̋L ID 𓾂邽߂ɂgBǂ̏ꍇԂl
     ͋L ID AG[\ -1 łBႦ΁Ab oCg̑
     ̋LȂAshmid = shmget(IPC_PRIVATE, b,
     (IPC_CREAT | 0666)) ƌĂяo

  3. ̃Xebv̓vZXɂ̋LA^b`āAʂ肱
     vZX̉z}bvɉBvO}[ shmat() ĂԂ
     ƂŁAzAhX̂ǂɋL̃ZOĝ킩
     B̃AhX̓y[WEɍĂȂ΂ȂȂ(Ȃ
      getpagesize() Ԃ傫̓y[W̑傫̔{ɂȂĂāA
      4096 oCgł)B܂AȑÕAhXɃ}bv
     ͖̂ɂȂB܂ȑO}bvĂ̂̂ɁÃAh
     Xgp悤ɃVXeɎŵłBǂ̏ꍇԂ
     l̓}bvꂽZOg̉zAhXւ̃|C^łBR[h
     ́Ashmptr = shmat(shmid, 0, 0) ƂȂ

     ӂׂ_́ALZOgɒuL static ϐ͂
     ׂč\̂̃o[ɂĐ錾邱ƂŊmۂłAƂƂB
      shmptr ̍\̂̃|C^ɂB̃eNjbNg
     ƁAx  shmptr->x ƎQƂł

  4. ̋L̃ZOgȂ΂ȂȂ́ÃZO
     gɃANZXŌ̃vZXI邩f^b`ꍇł
     B shmctl() ĂяoāAԂɐݒ肷KvBR[h
     ́A shmctl(shmid, IPC_RMID, 0) ̂悤ɂȂ

  5. Linux W fork() VXeR[gāAKvȃvZX𗧂
     cBꂼ̃vZX͋L̃ZOgp

  6. vZXL̃ZOggIAL̃ZO
     gKf^b`B shmdt(shmptr) ƂΗǂ

  ̂悤ɂ̃VXeR[ݒ̍ۂɕKvƂȂ܂Ax
  L̃ZOgmۂ΁Aǂ̃vZbT̒lς
  ĂIɂׂẴvZbT猩邱Ƃł܂Bł؂Ȃ
  ́AVXeR[̃I[o[wbhȂɑ삪ł邱ƂłB

  System V ̋L̃ZOgg C ̃vOłB
  ~vẐŁAZNV 1.3 ŎĝƓASY
  pĂ܂B

  ______________________________________________________________________
  #include <stdio.h>
  #include <stdlib.h>
  #include <unistd.h>
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <fcntl.h>
  #include <sys/ipc.h>
  #include <sys/shm.h>

  volatile struct shared { double pi; int lock; } *shared;

  inline extern int xchg(register int reg,
  volatile int * volatile obj)
  {
    /* Atomic exchange instruction */
  __asm__ __volatile__ ("xchgl %1,%0"
                        :"=r" (reg), "=m" (*obj)
                        :"r" (reg), "m" (*obj));
    return(reg);
  }

  main(int argc, char **argv)
  {
    register double width, localsum;
    register int intervals, i;
    register int shmid;
    register int iproc = 0;;

    /* Allocate System V shared memory */
    shmid = shmget(IPC_PRIVATE,
                   sizeof(struct shared),
                   (IPC_CREAT | 0600));
    shared = ((volatile struct shared *) shmat(shmid, 0, 0));
    shmctl(shmid, IPC_RMID, 0);

    /* Initialize... */
    shared->pi = 0.0;
    shared->lock = 0;

    /* Fork a child */
    if (!fork()) ++iproc;

    /* get the number of intervals */
    intervals = atoi(argv[1]);
    width = 1.0 / intervals;

    /* do the local computations */
    localsum = 0;
    for (i=iproc; i<intervals; i+=2) {
      register double x = (i + 0.5) * width;
      localsum += 4.0 / (1.0 + x * x);
    }
    localsum *= width;

    /* Atomic spin lock, add, unlock... */
    while (xchg((iproc + 1), &(shared->lock))) ;
    shared->pi += localsum;
    shared->lock = 0;

    /* Terminate child (barrier sync) */
    if (iproc == 0) {
      wait(NULL);
      printf("Estimation of pi is %f\n", shared->pi);
    }

    /* Check out */
    return(0);
  }
  ______________________________________________________________________

  ̗ł́AIA32 ̃Ag~bNȌ(exchange)߂găbN
  Ă܂BptH[}XƈڐAɗǂɂ́AoXbN
  閽߂悤ȓ݂̂ɒuĂ(ZNV 2.2
  Ř_悤)B

  R[hfobOꍇ́AݎgĂ System V  IPC @\̏
  Ԃ|[g ipcs R}hmĂƕ֗łB

  2.6.  }bvEVXeR[

  VXeR[̓t@Co͂ƂȂƏdȂ܂BۂɁA[U
  xł̃obt@t@Co̓Cu(getchar()A
  fwrite() )̂͂̂߂łBA[Uxł̃obt@
  ́ÃvZX݉\ȃt@CɃANZXꍇɂ͖
  ܂B܂ǗI[o[wbh΂ɂȂ܂B BSD
  UNIX ̖͂邽߁AVXeR[ 1 ǉ܂B
  ̓t@C̈ꕔ[ŨԂɃ}bvāAz̃y[W
  O@\𗘗pčXVŝłBSequent Ɠl݂̂N
  O玩Ђ̋Lg񏈗̋@\ƂĒ񋟂Ă܂B
  (ƂĂÂ)man ƁAƂĂےIȃRgU܂
  ALinux ł͏ȂƂ{Iȋ@\̂͐삵܂B
  VXeR[̃vZXŗpł鋤ʂ̃̃ZOg
  }bv̂Ɏgp̂͂܂łB

  {I Linux  mmap() ́AZNV 2.5 ̊{IȎ葱 2A3A4
  Ő System V ̋L̘gg݂Œu邱Ƃł܂B

  ______________________________________________________________________
  shmptr =
      mmap(0,                        /* system assigns address */
           b,                        /* size of shared memory segment */
           (PROT_READ | PROT_WRITE), /* access rights, can be rwx */
           (MAP_ANON | MAP_SHARED),  /* anonymous, shared */
           0,                        /* file descriptor (not used) */
           0);                       /* file offset (not used) */
  ______________________________________________________________________

  munmap()  System V ̋L shmdt() VXeR[Ɠ@\
  B

  ______________________________________________________________________
  munmap(shmptr, b);
  ______________________________________________________________________

  łASystem V ̋L̂ mmap() gĂA
  ǃbg͂ȂƎv܂B

  3.  Linux VXeŃNX^g

  ̃ZNVł́ALinux gNX^ɂ񏈗܂Ɍ
  čsƎv܂BNX^͑嗬sĂ邾łȂAAv[`
  ɃoGeBɕx݂܂BʂɃlbg[NɃ[NX
  e[VȂō\̂(ł)A̕}V܂
  ܂BœĂvZbTEm[h܂ Linux PC g
  ĂƂƂ܂B܂\tgEFAȐ Linux }V
  őg񂾃NX^g񏈗pɗpӂĂ܂B

  3.1.  ȂNX^Ȃ̂H

  NX^gŕ񏈗sƁA傫ȃbg
  B

  o  NX^\X̃}V͒PƃVXeƂĊĂāAL
     ͈͂ɑ̉ZprɗpłB̂ƂANX^gŕ
     ɉZƂƂ́A܂Ɋel̊ŁuʂȎԁvĂ
     郏[NXe[VׂĂɎd点AƂƂɑȂ
     Bۂ̂悤ȖʂȎԂW߂Ă邱Ƃ͂₷ƂłȂ
     ÃXN[Z[o[͒xȂ邾낤AZ͏I点邱
     ł邾낤

  o  ɂălbg[NVXe}ƂŁANX^\
     z邽߂ɕKvȃn[hEFȂʂɔ̔AɂƂ
     ʂƂĈȁuivo܂ĂBɃRXg
     iƂāANX^XɕKvȃrfIJ[hAj^[AL[{[h
     ꑵȂAƂƂB(Linux ŏɃC
     Xg[ꍇɂĎtΗǂBoĂ
     ܂΁Aʂ Linux ڂĂ PC ́AuR\[v͕sv)B
     ƔׂƁASMP tvZbT͔ɏisꂪAjbg
     Pʂ̃ptH[}X͍ɂȂ肪ł

  o  NX^vŹAɑK͂ȃVXeɂ܂ŊgłB
     ł́AvZbT 4 ȏڂ Linux ݊ SMP ͔̂
     ɍAʓIɗpłlbg[N@g 16 ̃}
     V܂ 1 ̃NX^Ƃč\złB΁A
     SAƂ}Vlbg[NłBہAC^[lbg
     ׂĂ 1 ̋ȃNX^Ƃ݂ȂƂł

  o  NX^̒Łuȃ}Vv邱Ƃ́AIɉꂽ
     SMP C邱ƂɔׂāAɑȂقǊȒPƂƂ͎
     łB܂Tdɐ݌vAݒ肵NX^͔ɍp
     炷ƂĂB͏dvȂƂŁAfłȂdvȃT[r
     X񋟂̃AvP[Vɑ΂Ăł͂ȂAʂɗp
     Ă\ȃvZbT𓋍ڂVXeɂă}V悭
     ȂꍇɂĂ͂܂B(Ⴆ΁APC Ȃ镽ώԂ 2
     NƂĂA32 ŃNX^głVXeł́AȂƂ 6
     ȓ 1 䂪Ȃ\B͔ɍmł
     )

  ł̓NX^t[ȏɁAgAlXȗprɗp
  \cȂ̂ɁAȂF̓NX^gpȂ̂ł傤H͑
  L̂悤ȗRłB

  o  OāAlbg[N@͕񏈗ɐ݌vĂȂB
     탌x̒xɍASMP tvZbTVXeɔבш
     ΓIɋBႦ΁ASMP ̒x͒ʏ퐔~bȏɂ͂ȂȂ
     ANX^ɂĂ͐ 100 琔 1000 ~b̂ʂł
     BSMP ʐMш敝ł 100 MB/bȏ̒lxXłBő̃lbg
     [N@ (Ⴆ΁uMKrbgEC[Tlbgv͑xʂ SMP ɕCG
     邪AʓIɗpĂlbg[ŃA 1/10 ` 1/1000 
     xȂ

     lbg[N@̃ptH[}X҂ɂ́ANX^̂߂ɓƗ
     lbg[Nł͕s\łB̃lbg[Ñg
     tBbN̉e󂯂ȂƂĂAu܂܃lbg[Nɐڑ
     }VvgƁANX^݌vVXeۂɃp
     tH[}XȂP[X

  o  NX^ 1 ̃VXeƂĈ\tgEFAقƂǊFB
     ΁Aps R}h 1  Linux VXẽvZX|[g
     ŁALinux VXeō\ꂽNX^Ŝׂ̂ẴvZX
     |[gł킯ł͂Ȃ

  ܂؂ł̓NX^͔߂ݔ\͂̂́AAvP[V
  ̑啔ł̔\͂oƂɍȂ悤łBKȂ
  ́ANX^Ƀ}b`悤ɃvÕptH[}Xx
  \tgEFAȂ肽񑶍݂Ă邱ƁAĂL͈͂ȃv
  ONX^ōptH[}Xグ悤ɓʂɐ݌v
  lbg[N݂邱ƂłB

  3.2.  lbg[N@

  Rs[^̃lbg[ŃA}̕łcAȂƂ͊
  ł傤B݂Llbg[NZpƂ̐i͌p
  ĊJĂȂ啔͂ЂƂ܂̃}VQ(Ⴆ΁A
   PC  Linux Ă)\Ă񏈗NX^ł
  pł܂B

  cOȂƂɁAǂ̃lbg[NZp肷ׂĂɉ킯
  ł͂܂BۖAAv[`̂ARXgAptH[}X
  肪ɕЂÂƂ͎v܂BႦ΁AʓIɔ̔Ăn[h
  EFȀꍇAlbg[N̂ɂ 5 h 4,000 h܂ł
  ܂B񋟂łш敝x܂܂ŁA傫 4 iK
  ȏɂȂ܂B

  ̃lbg[Nɂĕ׋悤ƂOɁAlbg[NƂ
  ̂́AXωĂ̂ł邱ƂmĂĂ(
  <http://www.linux.org.uk/NetNews.html>  Linux ֘Ãlbg[Nɂ
  Ẵj[X܂)Bălbg[N̒ɂ́Amȃf[^
  ɂ̂ƂƂmĂĂB

  mȏ񂪓Ȃɂ́A? ƏĂ܂B̘bɂ
  ͂Ȃ̎Ԃ܂AԈႢȂƂ܂񂵁AdvȎ
  ĂȂƂ܂BӏǉƂ
  ΁Applinux@ecn.purdue.edu ܂œdq[B

  LAN Zp̐\]܂Ƃ߂̂A
  <http://www.system75.com/documentation/dcom/lan-technology.html> ɂ
  AlXȃ^Cṽlbg[N LAN W ̓ڂĂ
  B HOWTO ł́ALinux NX^̍\zɖڂɊ֌W鑮
  œ_𓖂ĂĂ܂Ƃ߂Ă݂܂B̃ZNVł́A܂ꂼ̃lbg
  [N̓ȒPɂ܂Ƃ߂ĂÄӖɂĒ`Ă܂B

     Linux ̑Ή:
         no Ȃ猋ʂ͌܂łȂBłȂ΁AvO
        lbg[NɃANZX邽߂ɕKvƂȂ{IȃC^tF[
        XɂĐBlbg[N@̂قƂǂ́AJ[l̃h
        CooRŐڑĂāAʂ TCP  UDP ʐMɑΉĂB
        ̃lbg[N̂́A_CNg(Ⴆ΃Cu
        g)ڑĂāAJ[loRȂƂŒx}Ă
        B

        y󒐁F݂ Linux ̑Ή́ÃhLgꂽ_
        LĂ܂BJ[l 2.2.18 ŃT|[gĂ̂́Ae
        ڂŖ󒐂ŕ⑫܂BȊÓc߂Ȃz

        NOł΁AOS ̃VXeR[ɂĕ_Zu
        ANZX邱ƂÔƂƂčsĂA݂ł
        ܂Ӗ̂Ȃ@ɂȂĂBA񏈗vO
        ŝ OS ĂяoăvZbTԂ̒ʐMsƂ̓X
        }[gł͂ȂƎvBȂ̂́ARs[^܂ɂ
        𓝍ʐMi킹ĂȂ_ɂÂ߂ɃJ[
        loRȂiڐA̖Ă܂ɂȂB
        ߂ƐFXȘb𕷂悤ɂȂƎv邱ƂB
        ͉zC^tF[XEA[LeN`(Virtual Interface (VI)
        Architecture)( <http://www.viarch.org/>)̂悤ȐV̌nł
        B́Albg[NEC^tF[Xɑ΂鑀W
        @Ƃ邱ƂŁAʏ OS ̃VXeR[gpȂ悤ɂ
        B VI ɂ́ACompaq  IntelAMicrosoft QĂA
        Nɓoꂷ SAN (System Area Network) ɑ傫ȉe^邱
        Ƃ͊mł

     őш敝:
        FڂlB_IɒBłōlĂBۂ̐
        ͏ꍇɂĈقȂ邾낤

     Œx:
        ł́Aőш敝FڂׂlłBLƓɂ
        邪Ał͌Ił͂ȂŗǒlĂBA̒l
        ȂƂn[hEFAƃ\tgEFA҂ɂxׂ̌
        ܂łB̏ꍇlbg[N̒x͐}CNbxŁA
        ȏ傫ȒlɂȂƃn[hEFAƃ\tgEFÃC^tF[X
        ̃xŌƂĂ

     pł̂:
        ȒPɌ΁Ã^Cṽlbg[N@ɓ邩ǂ
        Bŝ̐i͑̃x_[񋟂ĂA낢Ɨ
        pł邪Aił傫ȗvƂȂĂB̃x_[
        oĂ鐻i 1 ȏ̋x_[痘p\ƂȂĂ
        邪A_Ȃ肠Aݐڑ̖܂łBPƃx
        _[̃lbg[Nł́AƎ҂̂ȂɂȂĂ܂(e؂ȋƎ
        邩Ȃ)BpubNEhCȐ݌vł́AN
        邱Ƃ͂ȂÄꕔwAō쐬Ă܂
        ƂłBiɓAʓIɂ͕O҂ɂł
        g`ɂȂĂȂAɓ邱ƂłȂ

     |[g̓oX̃C^tF[X:
        ǂ̂悤Ƀlbg[Nɐڑ̂H ō̃ptH[}Xō
        ʓIɕyĂ̂ PCI oX̃C^tF[XEJ[hł
        B̑ɂ EISA  VESA Local oX(VL bus)AISA oXJ[h
        BISA ͏ɓoꂵ̂ŁAptH[}XoȂJ[h
        ̂́A܂ɎgpĂBEISA  PCI }V̑ł
         1 ̃oXƂĎgĂ͂邪AقƂǃJ[h݂
        Bł́AVL oX͂قƂǖڂɂȂ(
        <http://www.vesa.org/> ł͂ł͂ȂƌĂ邪)

        APC P[XJɎgC^tF[Xł΁Aǂ
        Ȃ̂łȂƂ͂BIrDA  USB C^tF[X͓o
        ꂷ銄ȂBWpE|[g(SPP)́Av
        ^[t鎞Ɏgp邪Aŋ߂ł ISA oX̊Og
        lɌȂĂB̃C^tF[X̐V@\g
        IEEE 1284 KiŁAEPP  ECP gĂB܂Aɂ̐M
        ᑬ RS232 VAE|[gBVGA rfIRlN
        ^L[{[hA}EXAQ[|[gcgă}Vڑ
        ͕ƂȂ̂łȏGȂ

     lbg[N\:
        oX́A1 {̃P[uł蕡̃P[ȕW܂t@Co
        ł肷Bnu͏ȃP[XŁAނ̈قȂP[ut@
        Co[ŁAlbg[Nɐڑi񋟂BXCb
        `OEnúAڑɃf[^]łB

     ڑ}ṼRXg:
        ł͂̒l̗p@BႦ΁Albg[Nւ̐ڑ
        lɓȂƁANX^Ŏgpm[h 1 Ƃ PC 
        wɂ 2,000 h̃RXgBt@[XgEC[Tlb
        gǉƁAm[h 2,400 hɂȂB̂
        Myrinet ǉƁA悻 3,800 hɂȂB 20,000 h
        gȂAt@[XgEC[Tlbgt 8  }V
         Myrinet t 5 ̃}VĂ邱ƂɂȂBA
        ̃lbg[N𗘗p̂荠ȉiŎłBႦ
        20,000 h΁At@[XgEC[Tlbg TTL_PAPERS 
         PC  8 włBgplbg[N̎ނIāA
        ~݂΁AAvP[VőɓNX^ł

        ǂ܂ꂽ_ł́A̒lԈĂ邩Ȃcc
        OAmɊɊԈĂB啝ɒlĂ邩Ȃ
        Aǎ҂ʂɌ_ł邩ȂŁBłA
        ŋi͑S̓IɊԈIĂ܂Ȃ̂ł
        ȂBAvP[VʂȐĂANX^
        PC rIłĂAml(̈l
        ;-)ȃlbg[NƌȂƂ͂ȂB[
        ΁B

  ł́AL̏łƂāAĂƂɂ܂傤c

  3.2.1.  ArcNet

  o  Linux ̃T|[g: J[lgݍ݂̃hCo

  o  ōш敝: 2.5 M rbg/b

  o  Œx: 1,000 }CNb ?

  o  pł̂: ̃x_[̃n[hEFA

  o  |[g̓oX̃C^tF[X: ISA

  o  lbg[N\: _nu̓oXڑ(_Iɂ̓O\)

  o  ڑ}ṼRXg: 200 h

  ARCNET  LAN ̈ŁA͑gݗpr̃A^CVXe
  płBC[Tlbĝ悤ɁAIɂ̓oXɃ^bv݂Anu
   1 ȏuč\z܂BC[TlbgƈႤ_́Ag[Nx[X
  vgRgĂāA_Iɂ̓lbg[NOƂč\
  BpPbg̃wb_(3  4 oCg)AbZ[W 1 oC
  gƂȃf[^Ƃđ܂B܂ ARCNET ́AC[Tlbg
  xlȉŉ铙AmɃf[^`@\Ă
  ܂BcOȂ̂́AC[TlbgxxA܂藘p
  炸ÂŉiȂĂ܂BƏڂ́Athe
  ARCNET Trade Association  <http://www.arcnet.com/> Ō܂B

  3.2.2.  ATM

  o  Linux ̃T|[g: J[lg݂̃hCo AAL* Cu

  o  ōш敝: 155 M rbg/b (܂Ȃ 1,200 M rbg/b)

  o  Œx: 120 }CNb

  o  pł̂: x_[̃n[hEFA

  o  |[g̓oX̃C^tF[X: PCI

  o  lbg[N\: XCb`OEnu

  o  ڑ}ṼRXg: 3,000 h

  ߋNɓn肠ȂԂɂȂƂ΁AATM(Asynchronous
  Transfer Mode)͂ǂȂɖ邢cƂb낢땷Ă
  ͂łB ATM  HiPPI ŁAt@[XgEC[Tlbg
  łB܂ɒԂŎgpł邱ƂAdbЂڂĂ
  B ATM ̃lbg[NEvgŔA\tgEFAւ̃C^tF[X
  ɑ΂I[o[wbhȂȂ悤ɐ݌vĂAƂĂǂ
  ȃbZ[W⃊A^CȒʐM(Ⴆ΃fW^EI[fBIrfI)
  悤ɂȂĂ܂B܂ Linux ŗpłш敝łL
  vgR 1 ł܂B ATM ͈Ƃ͂Ax_[
  Ō̖݊肪Ă܂Ă܂BLinux ɂ ATM ֘A
  ̊J̊Tv́A  <http://lrcwww.epfl.ch/linux-atm/> Ō܂B

  3.2.3.  CAPERS

  o  Linux ̃T|[g: AFAPI Cu

  o  ōш敝: 1.2 Mrbg/b

  o  Œx: 3 }CNb

  o  pł̂: ŝ̃n[hEFA

  o  |[g̓oX̃C^tF[X: SPP

  o  lbg[N\: 2 ̃}VԂP[uŐڑ

  o  ڑ}ṼRXg: 2 h

  CAPERS(Cable Adapter for Parallel Execution and Rapid Synchronization)
  ́Ap[fw Electrical and Computer Engineering ōsĂ
  PAPERS vWFNg  <http://aggregate.org/AFAPI/> ĥ
  B̃̕|CǵAʓIɎgĂuLapLinkvƌĂ΂W
  v^[|[gԂŎgpP[ugāA\tgEFAŎ
  vgRłBPAPERS CuŎA2  Linux PC ڑ
  B̃ACfBA͊g͂Ȃ̂́AiCɂKv܂
  B TTL_PAPERS g΁AVXẽZLeBł܂BJ[l
  Ƀpb`𓖂Ă̂łAK{ł͂܂B
  <http://aggregate.org/AFAPI/> QƂĂB

  y󒐁FPAPERS ֘A̎́A҂P^bL[wֈٓꂽƂ
  <http://aggregate.org/AFAPI/> ֈڂĂ܂z

  3.2.4.  C[Tlbg

  o  Linux ̃T|[g: J[lg݂̃hCo

  o  őш敝: 10 M rbg/b

  o  Œx: 100 }CNb

  o  pł̂: ŝ̃n[hEFA

  o  |[g̓oX̃C^tF[X: PCI

  o  lbg[N\: XCb`O̓_nuAnugȂo
     Xڑ

  o  ڑ}ṼRXg: 100 h (nu 50 h)

  NAlbg[NZp̕Wƌ 10 M rbg/b̃C[Tlb
  gwĂ܂BC[Tlbg̃C^tF[XJ[h͗ǂ̂ł
  50 hȉōwł܂B܂Ȃ̐ PC ɂ́A}U[{[h
  ƂƃC[TlbgRg[Ă܂Bׂ̍Ȃ
  lbg[NȂAC[Tlbg̓nug킸ɕ̃^bv݂č\
  Ă\łBŏ̃RXgō\ł 200 ܂ŃT[rX
  ł܂A񏈗ɂ͌ȂłB_nu݂ĂptH[
  }Xグ邱Ƃ͂܂ł܂BXCb`OEnuݒu
  ΁Aш敝t܂ŎgēɒʐM\ɂȂARXg|[g
   100 hxł݂܂BLinux ̓C[Tlbg̃C^tF[X
  L͈͂ɃT|[gĂ܂AC^tF[X̂낢ȃn[hEFA
  ԂłȂptH[}XɍłĂ܂ƂCɎ~߂ĂĂ
  Bthe Hardware Compatibility HOWTO ΁AǂꂪT|[gĂ
  āAǂ̂炢ƓɂẴRgǂ߂܂B
  <http://www.scyld.com/network/index.html> ĂB

  ptH[}Xグ鋻[@܂B́ANASA  CESDIS
  (the Center of Excellence in Space Data and Information Sciences)ōs
  Ă Beowulf vWFNg( <http://www.beowulf.org/>)łB
  ł́A16 ̃}V Linux NX^Ă܂B̃vWFNg
  ɂ Donald Becker ƂC[TlbgJ[h̃hCo𐔑쐬
  āA݂ɌȂ̃C[Tlbgō\Ălbg[N
  ɂ܂镉וU邽߂ɊJsĂ܂ (܂Alb
  g[NAhXLƂ)B̕וÚA Linux ̕WI
  ȃfBXgr[Vɍŏ܂܂ĂāA\Pbgx̑
  ʂ̑wɂ͉BĂ܂BnũRXg͂΂ɂȂ܂Bꂼ
  ̃}V 2 ȏ̃nuɐڑȂōς܂A_nuŃC[T
  lbg̃lbg[Nɐڑł΁ApɃptH[}Xグ
  ƂĂǂ@ƂȂ܂BۂɁA 1 ̃}Vlbg[N̐\
  ̃{glbNɂȂĂ󋵂ł́ABꂽlbg[NgוU
  ́A1 ̃XCb`OEnuō\lbg[NptH[}X
  ɗDĂ܂B

  3.2.5.  C[Tlbg(t@[XgEC[Tlbg)

  o  Linux ̃T|[g: J[lg݂̃hCo

  o  őш敝: 100 M rbg/b

  o  Œx: 80 }CNb

  o  pł̂: ŝ̃n[hEFA

  o  |[g̓oX̃C^tF[X: PCI

  o  lbg[N̍\: XCb`O̓_nu

  o  ڑ}ṼRXg: 400? h

  uC[TlbgvƖOtĂ܂AȂقȂZp
  pĂ܂BAnux[X 100 M rbg/bC[Tlb
  gƂāAȑÓu10 BaseTvƌĂ΂ 10 M rbg/bŎgf
  oCXƃP[uƑ͌݊̂ƂĂ悭ɏo
  B̗\zʂAC[Tlbgƌׂ̂Ă͂悻傫Ȏs
  ɉiݒ肵ĂÃC^tF[X 155 M rbg/b ATM
  J[hɔׂƎɑȂiݒɂȂĂ܂B_ 1 {
  100 M rbg/b́uoXv(_nugp)̑ш𕪊ĕ̃}V
  ܂Ƃ܂ėpƁA炭XCb`OEnugĂꂼ̃}V
   10 M rbg/btɗpĂ 10 M rbg/b̃C[Tlbg
  ςē炢̃ptH[}XoȂ_ɂ܂B

  ꂼ̃}V 100 M rbg/b𗘗płXCb`OEnu
  ͂ƂĂłAi͓XĂă_nuƔrălbg[
  NŜƂĂ̑ш͂ƂĂLł܂BATM XCb`ɂȂĂ
  킯́AATM ̃Z(C[TlbgƔׂď)ꂼXCb`Ȃ
  ƂȂłBt@[XgEC[Tlbgp̃XCb`̒ɂ́AX
  Cb`pxႢƎvꍇɁAʂ𔭊̂܂B
  ĂZṕAXCb`ʉ߂Ԃ̒x͒Ⴂ̂łAX
  Cb`̃pXύXƁA~b̒xĂ܂cBoH
  ύXpɂɋNꍇ́Â悤ȃXCb`͔܂傤BJ[hh
  CoɂĂ̂낢ȏ́A <http://www.scyld.com/network/> 
  ĂB

  ܂C[TlbgɂẮANASA  Beowulf vWFNg
  <http://www.beowulf.org/>ɂĕ̃t@[XgEC[TlbgԂŕ
  וUsAptH[}XコZpJĂ邱ƂY
  łB

  y󒐁FBeowulf vWFNǵADon Becker ͂߂Ƃ Beowulf v
  WFNg̃o[ɂĐݗꂽ Scyld Computing Corporation
  <http://www.scyld.com> ɂ̊̏ꂪڍsĂ܂B

  3.2.6.  C[Tlbg(MKrbgEC[Tlbg)

  o  Linux ̃T|[g: J[lg݂̃hCo

  o  őш敝: 1,000 M rbg/b

  o  Œx: 300 }CNb ?

  o  pł̂: x_[̃n[hEFA

  o  |[g̓oX̃C^tF[X: PCI

  o  lbg[N̍\: XCb`OEnu FDR (Sds[^
     nu)

  o  ڑ}ṼRXg: 2,500 h ?

  MKrbgEC[TlbgɂĂ͂悭킩܂B
  <http://www.cis.ohio-state.edu/~jain/refs/gbe_refs.htm> łȂC[T
  lbgƌĂԂ̋ZpIȐ܂c̓MKrbgE
  C[TlbgʎsłAIP ƂƃT|[gR
  s[^̃lbg[N^[QbgɂĂƂƂɑȂ
  B݂̉iƁA܂MKrbgEC[Tlbg̋@ނ͍\
  ẑɂ͂܂SzȂƂ낪̂łB
  ̃C[TlbgZpƂ͈قȂAMKrbgEC[Tlbg̓t[
  @\ĂāAM̍lbg[N\zł͂łB
  FDR ͑Sd̃s[^APȑdȂǃobt@OǏI
  ȃt[sƂŁAptH[}Xサ܂BXCb`OEn
  ȗ啔́ÃMKrbgEC[Tlbg𗘗pł镔iVC
  ^tF[XEW[Ƃđgݍł܂BXCb` FDR i
  ȂƂ̃[J[oׂĂAiAiEXĂ
  ܂B <http://www.acacianet.com/>A <http://www.baynetworks.com/>A
  <http://www.cabletron.com/>A <http://www.networks.digital.com/>A
  <http://www.extremenetworks.com/>A <http://www.foundrynet.com/>A
  <http://www.gigalabs.com/>A <http://www.packetengines.com/>A
  <http://www.plaintree.com/>A <http://www.prominet.com/>A
  <http://www.sun.com/>A <http://www.xlnt.com/>B

  Linux ̃hCo  <http://www.scyld.com/network/yellowfin.html> 
  Packet Engines  <http://www.packetengines.com/> ́uYellowfinv G-
  NIC p܂B Linux ł̏iK̃eXgł́A\ 100 M rb
  g/b̃t@[XgEC[Tlbgoш敝̂悻 2.5 {̐\
  Ă܂BMKrbgEC[Tlbg̃lbg[Nł PCI oXTd
  `[jO邱ƂƂĂ؂ɂȂ܂BhCoǂA
  NIC p Linux hCoǂďoĂ邱Ƃ͊ԈႢ܂B

  y󒐁FLhCoɉāAAlteon  AceNIC  3Com 
  3C985/NetGear GA620 GigabitAPacket Engines  GNIC-II
  (Hamachi)ASysKonnect  SK-98xx T|[gĂ܂z

  3.2.7.  FC (t@Co[E`l)

  o  Linux ̃T|[g: no

  o  őш敝: 1,062 M rbg/b

  o  Œx: ?

  o  pł̂: x_[̃n[hEFA

  o  |[g̓oX̃C^tF[X: PCI?

  o  lbg[N̍\: ?

  o  ڑ}ṼRXg: ?

  FC(t@Co[E`l)̖ڎwƂ́A\ȃubN^̓o
  (FC ̃t[ xɍő 2,048 oCg̃f[^`ł܂)ŁA
  ɃfBXN⑼̋LuRs[^oRŐڑ FC ɒڐڑ
  ċLł܂Bш敝ɊւĂ΁AFC  rIȂ̂ɕނ
  A 133 ` 1,062 M rbg/b͈̑̔͂œ삵܂BFC nCGh
   SCSI ɂƂĂقǈʓIɂȂ΁A}ɈȋZpɂȂƎv
  ܂B͍łALinux ̓T|[gĂ܂BFC ɂ
  ́A the Fibre Channel Association ێǗĂ
  <http://www.fibrechannel.com/> QlƂėǂł傤B

  y󒐁FLTCg̓{ł́A <http://www.fcaj.org/> łB܂A
  Compaq  Fibre Channel 64-bit/66Mhz HBA(SCSI low-level drivers Ƃ
  ) Interphase  5526 Tachyon chipset based adaptor(Token T|[
  gĂ܂z

  3.2.8.  FireWire (IEEE 1394)

  o  Linux ̃T|[g: no

  o  őш敝: 196.608 M rbg/b (܂ȂA393.216 M rbg/bɂ
     )

  o  Œx: ?

  o  pł̂: x_[̃n[hEFA

  o  |[g̓oX̃C^tF[X: PCI

  o  lbg[N̍\: [vĂȂȂ牽ł(ݒ)

  o  ڑ}ṼRXg: 600 h

  FireWire( <http://www.apple.com/firewire/>)́AIEEE 1394-1995 ŕW
  ĂāAōȃfW^lbg[Nƒpdiɂ炷
  ƂڎwĂ܂B݂̑\Iȗpr̓fW^rfIJƃR
  s[^̐ڑłA SCSI ̑ւz[VA^[ɂ@
  ފԂ̐ڑ܂łJo[邱ƂڎwĂ܂B65,536 ̃foCX
  ڑ\ŁA[vĂȂoX^ubW^ł΂ǂȐڑ̂
  ł܂܂B܂@𔲂ƁAIɍ\m邱
  Ƃł܂B(4 oCgBuquadletvƌĂ΂Ă)Ax̏
  bZ[WT|[gĂāA ATM  `
  (isochronous transmission)(}`fBApbZ[W̓Ƃ邽
  Ɏgp)Ɠ悤Ȃ̂łBAdaptec ́AFireWire iĂāA
  63 ̃foCX 1  PCI C^tF[XJ[hɐڑł܂B܂
  FireWire Sʂ̏
  <http://www.adaptec.com/worldwide/product/prodtechindex.html?cat=%2fTechnology%2>
  ŌJĂ܂B

  FireWire ł͍ō̑ш敝lbg[N𗘗pł悤ɂ͂Ȃ
  Ǝv܂Bʏґ̎s(ቿiHƂKv)
  _Ă邱ƁAxȂƂAN Linux PC ł̃NX
  ^̃bZ[WʐMplbg[NZp̍œK 1 ƂȂƎv
  B

  3.2.9.  HiPPI  Serial HiPPI

  o  Linux ̃T|[g: Ȃ

  o  őш敝: 1,600 M rbg/b (serial  1,200 M rbg/ b)

  o  Œx: ?

  o  pł̂: x_[̃n[hEFA

  o  |[g̓oX̃C^tF[X: EISAAPCI

  o  lbg[N̍\: XCb`OEnu

  o  ڑ}ṼRXg: 3,500 h (serial is 4,500 h)

  HiPPI(High Performance Parallel Interface)͂ƂƔɑ傫ȃf[^
  ̓`X[p[Rs[^₻̑̃}V(X[p[Rs[^t
  [obt@AfBXNAC)Ԃőш敝傫ƂčsƂ
  IƂč܂BăX[p[Rs[^̕ł́A̕W
  ƂȂĂ܂BSerial HiPPI ʓIɂȂĂĂA 32 rbg
  ̕W(p) HiPPI P[ug킸ɁAt@CõP[u
  ʂ͗p܂Bserial ƌȂP[uĝ͂ւłB
  NO HiPPI gNXo[XCb`LĂAi}
  Ă܂BPCI C^tF[XJ[hT|[gĂ serial
  HiPPI ͈ˑRƂĊȂ̂cOłBɎcOȂƂɁALinux 
  HiPPI ܂T|[gĂ܂BCERN Ă HiPPI ̗DꂽT
    <http://www.cern.ch/HSI/hippi/> ɂ܂BCERN ͂̑ɂ
  HiPPI Ă鐔̃x_[ꗗ
  <http://www.cern.ch/HSI/hippi/procintf/manufact.htm> ŌJĂ
  B

  y󒐁FHiPPI  EXPERIMENTAL ŃT|[gĂ܂z

  3.2.10.  IrDA (Infrared Data Association)

  o  Linux ̃T|[g: Ȃ ?

  o  őш敝: 1.15 M rbg/b  4 M rbg/b

  o  Œx: ?

  o  pł̂: x_[̃n[hEFA

  o  |[g̓oX̃C^tF[X: IrDA

  o  lbg[N̍\: ܂ ;-)

  o  ڑ}ṼRXg: 0 h

  IrDA(Infrared Data Association  <http://www.irda.org/>)͏ȐԊO
  gfoCXŁÃbvgbv^Cv PC ̑ʂɂĂ
  B̃C^tF[XgāA2 ȏ̃}Vڑ̂͂
  Ȃ̂ŁANX^ŗp͓̂K؂ł͂܂B Don Becker 
  Ƃ IrDA g悤ɂ܂B

  y󒐁FɃT|[gĂ܂z

  3.2.11.  Myrinet

  o  Linux ̃T|[g: Cu

  o  őш敝: 1,280 M rbg/b

  o  ŏx: 9 }CNb

  o  pł̂: Pƃx_[̃n[hEFA

  o  |[g̓oX̃C^tF[X: PCI

  o  lbg[N̍\: XCb`OEnu

  o  ڑ}ṼRXg: 1,800 h

  Myrinet( <http://www.myri.com/>)̓[JEGAElbg[N(LAN)
   1 ŁAuVXeEGAElbg[Nv(SAN)悤ɐ݌v
  Ă܂B܂Ãlbg[N 1 ̃LrlbgɃ}V
  [ڑ邱ƂŁAVXe\ł܂BLAN  SAN ł͕
  IȔ}̂قȂĂāA̓኱Ⴂ܂Bʏ SAN ł́A1 
  ̃NX^Ŏgp̂ʓIłB

  Myrinet ͍\VƂ͂قƂǂ܂񂪁AptH[}X
  Ăǂƕ]łBLinux p̃hCo͐\ƂĂǂƌĂ
  AzXgRs[^ɕt PCI oX̎ɃptH[}X̍
  Ђǂ傫ƂĂ܂B

  ł́AMyrinet ̓NX^\zۂɁu\ZlvɂقǃVrA
  ɂȂKvȂO[vɂƂẮAƂĂ͓Iȃlbg[NłB
  Linux PC ɃnCGh Pentium Pro  Pentium IIAȂƂ 256 MB
   RAM 𓋍ڂāASCSI RAID 邮炢ȂAMyrinet ͎荠Ƃ
  Ăł傤Bƕʂ PC ō\ȂAIƂ N
  ̃}V Myrinet Őڑ邩A2N 𕡐̃t@[XgEC[Tlb
  g TTL_PAPERS gĐڑ邩̂ǂ炩ɂ̂ł͂Ȃł傤
  B͗\ZŁAvZ鎖ɑ΂ĉɈԒӂ邩ɂ
  Ƃ낪傫łB

  3.2.12.  Parastation

  o  Linux ̃T|[g: HAL ̓\PbgECu

  o  őш敝: 125 M rbg/b

  o  Œx: 2 }CNb

  o  pł̂: Pƃx_[̃n[hEFA

  o  |[g̓oX̃C^tF[X: PCI

  o  lbg[N̍\: bVŃnuuȂ

  o  ڑ}ṼRXg: 1,000 hȏ

  ParaStation vWFNg( <http://wwwipd.ira.uka.de/parastation>)
  ́AUniversity of Karlsruhe Department of Informatics ōsĂāA
  PVM ݊̒xȂ̃lbg[NłB܂̃vWFNgł
  2 ̃vZbT𓋍ڂ ParaPC ̃vg^CvグAɓƎ
   EISA J[h̃C^tF[X𓋍ڂABSDn UNIX 𑖂点܂B
  ꂩ DEC  Alpha }VgđK͂ȃNX^\z܂
  B1997 N 1 ALinux ł ParaStation pł悤ɂȂ
  BPCI J[h Hitex( <http://www.hitex.com:80/parastation/> Q
  ƂĂ)ƂƂƋŊJ܂BParaStation ̃n[h
  EFAɂ́AŁAMAbZ[WʐMȌȃoA
  Ă܂B

  y󒐁FHitex ̃n[hEFA͌ݎgpĂ܂BMyrinet
  (http://www.myri.com/)̗pĂ܂z

  3.2.13.  PLIP

  o  Linux ̃T|[g: J[lg݂̃hCo

  o  őш敝: 1.2 M rbg/b

  o  Œx: 1,000 }CNb ?

  o  pł̂: ŝ̃n[hEFA

  o  |[g̓oX̃C^tF[X: SPP

  o  lbg[N̍\: 2 ̃}VԂP[uŌ

  o  ڑ}ṼRXg: 2 h

  ubvNvP[ũRXg܂BPLIP(Parallel Line
  Interface Protocol)́A2  Linux }VWp|[gŌ
  ŁAʂ̃\Pbgx[X̃\tgEFAŒʐMs܂Bш敝xA
  g̖ʂ炷Ɩ{iIȃlbg[NZpƂ͂܂BAR
  XgقƂǂRȂƁA\tgEFǍ݊_ł͕֗
  BhCo͕ʂ Linux J[l̃fBXgr[VɊ܂܂
  ܂B

  3.2.14.  SCI

  o  Linux ̃T|[g: no

  o  őш敝: 4,000 M rbg/b

  o  ŏx: 2.7 }CNb

  o  pł̂: x_[̃n[hEFA

  o  |[g̓oX̃C^tF[X: PCI  x_[Ǝ̂

  o  lbg[N̍\: ?

  o  ڑ}ṼRXg: 1,000 h

  SCI(Scalable Coherent Interconnect ANSI/IEEE 1596-1992)́AK͂ȃ}
  VQœƂȂ狤LɃANZX@\(lXȃ^Cv
  bZ[W̃ubN]Ȃ)\ɒ񋟂邵݂ڎwĂ
  BSCI ̐݌v́Aш敝ƒxɂđ̂قƂǂ̃lbg[NZp
  rāuf炵vƌĉߌł͂Ȃł傤B_́ASCI 
  ȐiƂčLpłȂƂ Linux T|[gĂȂƂ
  B

   SCI ́A_Iɂ͋LĂ邪Iɂ͕UĂ郁
  ڂĂ郁[J[Ǝ̃}Vɍ̗pĂ܂BႦ΁AHP/Convex 
  Exemplar SPP  Sequent  NUMA-Q 2000 ( <http://www.sequent.com/>)
  ǂłB SCI  PCI C^tF[XEJ[h 4 |[g̃XCb
  `(4 |[g̃XCb` 4 JXP[hāA16 ܂ł̃}Vڑ
  \) Dolphin( <http://www.dolphinics.com/> NX^ĩC
  ibvƂĔ̔Ă܂BCERN(
  <http://www.cern.ch/HSI/sci/sci.html> ɂ͗Dꂽ SCI ̊T̃NW
  ܂B

  y󒐁FSequent  1998 N IBM ɋz܂BNUMA V[Y IBM
  @server x V[Yy IBM NUMA-Q ƂĔĂ܂z

  3.2.15.  SCSI

  o  Linux ̃T|[g: J[lg݂̃hCo

  o  őш敝: 5 M rbg/b  20 M rbg/bȏ

  o  ŏx: ?

  o  pł̂: x_[̃n[hEFA

  o  |[g̓oX̃C^tF[X: PCIAEISAAISA J[h

  o  lbg[N̍\: }VԂŃoXg SCSI foCXL

  o  ڑ}ṼRXg: ?

  SCSI(Small Computer Systems Interconnect)́AfBXNEhCu
  CD-ROMA摜XLi[̓o͂̂߂̃oXłBSCSI-1  SCSI-2A
  SCSI-3 ƂƗKi܂B܂x̖ʂ Fast  UltraA
  f[^̓]Ƃ 8A16A32 rbg(FireWire Ƃ̌݊ SCSI-3 
  `Ă܂)܂BȂ蕡GȂ̂łA\̗ǂ SCSI 
  EIDE ኱A葽̃foCXɌIɈ͎̂m
  łB

  2 ̃Rs[^ 1 { SCSI oXLł邱ƂɋCÂĂȂ
  \zOɂ񂢂܂B̃^Cv̍\́AfBXNEhCu}
  VԂŋL̂ɂƂĂ֗ŁAtFCEI[o[܂B
  Ã}VȂɂ̃}Vɑ΂f[^x[Xւ
  v肷Ƃ悤ɁB݂̂ƂAMicrosoft  PC NX^
  ił WolfPack ́Â݂񋟂Ă܂B SCSI 
  L邱݂̂AK͂ȃVXeւƊgłȂƂŁA
  ʂɂƂĂ͐F݂ɂȂĂ܂Ă܂B

  3.2.16.  ServerNet

  o  Linux ̃T|[g: no

  o  őш敝: 400 M rbg/b

  o  Œx: 3 }CNb

  o  pł̂: Pƃx_[̃n[hEFA

  o  |[g̓oX̃C^tF[X: PCI

  o  lbg[N̍\: Zʁ{c[\Ǝlʁ{iq\nu

  o  ڑ}ṼRXg: ?

  ServerNet  Tandem( <http://www.tandem.com>)񋟂Ă鍂\
  ȃlbg[N@łBɃICEgUNV (OLTP)
  ł́ATandem ͍MVXe邱Ƃł̓gbvN
  Xɂ̂͗LłBł Tandem ̃lbg[NptH[}
  Xł͂ȂAf[^̕ۑSƐMǋĂ͓̂R̂Ƃ
  B 1  ServerNet [_́AfoCXmڃf[
  ^Ƃł_ɂ܂BvZbTԂł͂ȂAfBXNEh
  Cuԓł\łBZNV 3.5 Ő MPI Ă
  [JłȂɑ΂Ă̕Еւ̃ANZX̂ƎĂ܂B
  Ō 1  ServerNet ɂăRg邱Ƃ܂BPƃx
  _[T|[gĂ܂񂪁Ãx_[ ServerNet ̕W
  ɂ邾̗͂܂c Tandem ̐eЂ Compaq łB

  y󒐁FuZʁ{c[\Ǝlʁ{iq\nuv̋̓IȐ}́A
  ServerNetFeʃf[^̍ړ\ɂVT[o[E A[LeN
  `[  I/O ւ̃Av[`
  <http://www.compaq.co.jp/tandem/technology/servernet/whitepaper/BRKTECWP.html>
  ɂ}(} 7  8)QƂĂBɂ͂ڍׂ ServerNet 
  ܂z

  3.2.17.  SHRIMP

  o  Linux ̃T|[g: [Ux̃}bsOC^tF[X

  o  őш敝: 180 M rbg/b

  o  ŏx: 5 }CNb

  o  pł̂: iK̎i

  o  |[g̓oX̃C^tF[X: EISA

  o  lbg[N̍\: bṼobNvC(Intel  Paragon 
     悤)

  o  ڑ}ṼRXg: ?

  SHRIMP vWFNg( <http://www.CS.Princeton.EDU/shrimp/>) ́Av
  Xgw Computer Science Department ōsĂ܂B Linux 
  Ă PC Zm[hƌȂA1 ̕Rs[^Ƃč\z
  ܂Bŏ  SHRIMP(Scalable, High-Performance, Really Inexpensive
  Multi-Processor)́AƎ EISA J[h̃C^tF[XɃfA|[
  g RAM ςŁAvZbT 2 ڂ@łB̎@
  ́A\̋K͂傫ȂAƎ̃C^tF[XEJ[h Intel
   Paragon( <http://www.ssd.intel.com/paragon.html> Q) y󒐁F
  N؂zƓlȃbV̌oHunuvɐڑĂ܂BI[
  o[wbhuzɃ}bvʐMv@ƂT|[g
  \tgEFÅJɐ͂𒍂ł܂B

  y󒐁FIntel ̓X[pRs[^̐𒆎~Ă܂BParagon ̎p
  ́A <http://www.cs.sandia.gov/HPCCIT/gif/paragon.gif> Ō邱Ƃ
  ܂z

  3.2.18.  SLIP

  o  Linux ̃T|[g: J[lgݍ݂̃hCo

  o  őш敝: 0.1 M rbg/b

  o  Œx: 1,000 }CNb ?

  o  pł̂: ŝ̃n[hEFA

  o  |[g̓oX̃C^tF[X: RS232C

  o  lbg[N̍\: 2 ̃}VԂ̃P[u

  o  ڑ}ṼRXg: 2 h

  SLIP(Serial Line Interface Protocol)́AptH[}X̓_ł̓[G
  hɈʒuÂ܂B SLIP( CSLIP  PPP) 2 ̃}V
  𕁒ʂ RS232 VA|[goRŃ\Pbgx[X̒ʐM\
  BRS232 |[g̓kEf RS232 VAP[ugĐڑ
  A܂foRŃ_CAbv邱ƂŐڑ邱Ƃł܂B
  ̏ꍇłxAш敝͋߁ASLIP ͑ɑIȂꍇ
  gׂłBǂɂƂ낪܂񂪁APC ̑啔
  RS232  2 |[gĂ̂ŁA}VԂ𒼗̓Oɐڑ
  邱ƂŃlbg[Ng߂܂BוÛ߂ EQL Ƃ\tg
  EFApӂĂ܂B

  3.2.19.  TTL_PAPERS

  o  Linux ̃T|[g: AFAPI Cu

  o  őш敝: 1.6 M rbg/b

  o  Œx: 3 }CNb

  o  pł̂: pubNEhCŐ݌vPƃx_[̃n[
     hEFA
  o  |[g̓oX̃C^tF[X: SPP

  o  lbg[N̍\: c[̃nu

  o  ڑ}ṼRXg: 100 h

  PAPERS(Purdue's Adapter for Parallel Execution and Rapid
  Synchronization) vWFNg( <http://aggregate.org/AFAPI/>)́Ap[
  fw School of Electrical and Computer Engineering ōsĂ
  ܂BgAx̏ȂWZʐMn[hEFAƕ
  ʂ PC ⃏[NXe[VX[p[Rs[^̃m[hƂč\
  ł\tgEFA\zĂ܂B

   10 ^Cv PAPERS ̃n[hEFAASPP(Standard Parallel
  Port) oR PC ⃏[NXe[VɐڑĂ܂B܂Ɍ
  2 ̊Jv悪i߂Ă܂BuPAPERSvƌ̂́AptH[
  }X̌ړIƂāAӂ킵Ǝv邠ZpgĂ
  ܂B FPGA(Field Programmable Gate Array)gALш敝
   PCI oXC^tF[X̐݌vsĂāA҂ƂJłB
  uTTL_PAPERSv͂Ƃ͑ΏƓIŁAp[fwȊOłȒPɍ\zł
  悤ɐ݌vĂ܂BƂĂVvpubNEhCȐ݌v
  ŁAʓI TTL ̃WbNgč\zĂ܂B̐݌v͏pł
  pĂ܂( <http://chelsea.ios.com:80/~hgdietz/sbm4.html>) y
  FN؂z

  ̑wƎ̃n[hEFA݌vĂ̂ɑ΂āATTL_PAPERS N
  X^͕č؍Ɏ܂ŁALwō\zĂ܂Bш敝
  SPP ɂڑȂ̂Ő܂APAPERS ͂ق̂킸
  xŏWZʐMĂ܂BbZ[Ww^CṽVXe̒
  ōő̂̂łAWZ̃ptH[}Xł PAPAERS ɂ͂т܂
  B܂ PAPERS ́ArfIEEH[̃j^[Ԃ̓(߁Xɏo
  Video Wall HOWTO łɘ_܂)Lш敝lbg[Nւ̃A
  NZXǗA`ɂS̓K̕]ɓɗDĂ
  BPAPERS NX^ IBM  PowerPC AIX ⋌ DEC( Compaq) Alpha
  OSF/1AHP  PA-RISC HP-UX ̃}Vł\zĂ܂ALinux x[
  X PC ̃T|[gԂłB

  [Ux̃vO  TTL_PAPERS AFAPI(Aggregate Function API)
  gƁALinux z SPP ɐڑĂn[hEFA|[g̃WX^
  ڃANZX܂̂ŁAANZXɃVXeR[͔܂B
  ɂ́A܂ AFAPI  iopl()  ioperm() gă|[gɃANZX
  悤ɂ܂B̃VXeR[oƂA[ŨvO
  ɓKvAꂪݓIɃZLeBEz[ɂȂ
  ꂪ_ƂȂ܂B̖ɂ́AJ[lɃpb`
  <http://aggregate.org/AFAPI/>)ǉēĂāAvZX
  vZX̃|[gɑ΂ANZX𐧌ł悤ɂ܂B

  3.2.20.  USB (Universal Serial Bus)

  o  Linux ̃T|[g: J[lgݍ݂̃hCo

  o  őш敝: 12 M rbg/b

  o  Œx: ?

  o  pł̂: ŝ̃n[hEFA

  o  |[g̓oX̃C^tF[X: USB

  o  Network ̍\: oX

  o  ڑ}ṼRXg: 5 h ?

  USB(Universal Serial Bus  <http://www.usb.org/>)́Adꂽ܂܂
  łA]̃C[Tlbg݂̑xoƂł܂BL[
  {[hrfIcp̃J܂ŁAӋ@ނ 127 ܂ŃoXɐڑ
  ł܂B̃Rs[^ꂼ USB gĐڑ@͂悭
  킩܂BɂĂ USB |[g RS232  SPP Ɠl PC 
  }U[{[hɂ܂ȂWŕtƂɂȂ܂̂ŁA PC w
   USB |[g 1A2 tĂĂsvcł͂܂BLinux ̃h
  Co̊JɂẮA <http://www.linux-usb.org/> ŋc_Ă
  B

  Ӗ USB ́AptH[}XႭARXgȂAݍw
  \ FireWire ̈ƌȂƂ܂B

  3.2.21.  WAPERS

  o  Linux ̃T|[g: AFAPI Cu

  o  őш敝: 0.4 M rbg/b

  o  Œx: 3 }CNb

  o  pł̂: pubNEhCȐ݌v

  o  |[g̓oX̃C^tF[X: SPP

  o  Network ̍\: 2  64 ̃}VԂ̉H

  o  ڑ}ṼRXg: 5 h

  WAPERS(Wired-AND Adapter for Parallel Execution and Rapid
  Synchronization)́Ap[fw School of Electrical and Computer
  Engineering ōsĂ PAPERS vWFNg
  <http://garage.ecn.purdue.edu/~papers/>y󒐁FN؂zh
  ܂BƎĂ΁ASPP  4 rbg̃I[vERN^o
  ͂łA}VԂׂĉHāA4 rbg̘_H
  B̘_H͓dCIɈɂA̕@Őڑł}V̍ő
  |[g̃AiOɋɂ߂ĈˑĂ܂(ő̃VNdv
  AbvWX^lBʏ WAPERS ł́Albg[Nɂ 7A8 ̃}V
  ڑł܂BRXgx͒Ⴂ̂́Aш敝Ȃ܂B WAPERS
  ̓NX^\̒ŗB̃lbg[NƂĎgƂAWZ
  ̑̂߂̓񎟓Iȃlbg[NɓKĂ܂B TTL_PAPERS Ɠl
  ɁAVXẽZLeBグ̂ɂ̓J[lւ̏ȃpb`𓖂
  邱ƂĂ܂AKKvł͂܂(
  <http://garage.ecn.purdue.edu/~papers/giveioperm.html>)B

  3.3.  lbg[Nɑ΂\tgEFÃC^tF[X

  AvP[Ṽ\tgEFÃT|[g_OɁA܂lbg
  [N@ɑ΂჌xȃ\tgEFÃC^tF[X̊bɂ
  āÅTĂƂɂ܂傤B{IɑI͂ 3 
  ܂B̓\PbgƃfoCXEhCoƃ[Ux̃Cu
  łB

  3.3.1.  \Pbg

  ჌x̃lbg[Nɑ΂C^tF[Xň|IɍLǵA
  \PbgEC^tF[XłB\Pbg͂ƈȑO UNIX ̈@\
  AWIȃlbg[N@̑啔͏ȂƂ \Pbg 2 ̃^
  CṽvgRT|[g悤ɐ݌vĂ܂B UDP 
  TCP łB^Cṽ\PbgƂA}V瑼̃}V֔Cӂ̑傫
  ̃f[^ubN𑗂邱Ƃ\łBA{IɈقȂ_
  ܂B҂ƂŒx͂悻 1,000 }CNbxłA
  ̐\̓lbg[N̗ʂɂĂ͂ɒቺ܂B

  ̃^Cṽ\PbǵAڐA荂xȃx߂񏈗\
  tgƂĂ͊{ƂȂlbg[NC^tF[XłBႦ PVM 
  UDP  TCP gݍ킹ĎgpĂ܂̂ŁA҂̑m邱ƂŃp
  tH[}Xł悤ɂȂł傤BɃptH[}Xグ
  ̂ɁAvO̒璼ڂ̋@\𗘗p邱Ƃł܂B
  L UDP  TCP ɂĂ̊ȒPȊTqׂ܂BڂƂ man 
  lbg[NEvO~OɂĂ̗ǏǂłB

  3.3.1.1.  UDP vgR(SOCK_DGRAM)

  UDP  User Datagram Protocol ̗̂łA̓Ɗo₷
  邽߂ɁAUnreliable Datagram Processing(M̂Ȃf[^)Ƃ
  Ă̂ł͂Ȃł傤B܂ UDP ͑MubNƗ
  bZ[WƂĂāÃbZ[W͓`ɖȂ邩Ȃ̂
  BAlbg[N̗ʂł UDP bZ[WȂA
  ĂAԂƂ͈ႤԂł肷\
  BUDP bZ[W͎̑Iɂ̏󋵂m邷ׂ͂ȂA[U
  gR[hŌmāA̖ɑΏKv܂BKȂ
  ƂɁAUDP ̓bZ[WĂ΁A̒g͉ĂȂƂ
  ؂Ă܂(ւ΁A1  UDP bZ[W̒fЂ󂯎
  Ƃ͂蓾܂)B

  UDP ̗ǂƂ́A\PbgvgR̒ł͍őłꍇ
  łB̏ UDP ́uRlNVXvŁA͌X̃bZ[W
  ׂẴbZ[WƓƗĂ邱ƂӖĂ܂BႦƁAX
  bZ[W͗Xւɏo莆ƓłBZɂ莆o
  AX̎莆͑̂̂Ƃ͉̊֌W܂񂵁Aǂ̂炢̐l
  oƂƂ̂͂܂B

  3.3.1.2.  TCP vgR(SOCK_STREAM)

  UDP Ƃ͈ႢATCP͐MRlNVx[X̃vgRłB
  X̃ubNḾA1 ̃bZ[WƂ͌ȂꂸAMԂ̃RlN
  Vʂē`AÃoCgXg[̒̃f[^ubN
  Ĉ܂Bꂪ UDP bZ[WƑ傫Ⴄ_ŁAX̃ubN
  ͒PɃoCgXg[̈ꕔɉ߂A[UgR[hɂ
  ̃oCgXg[ubNoKv܂BAb
  Z[W𕪉邽߂̈󂪂ȂɁARlNV̓lbg[N̏Q
  キAꂼ̃vZXœɃRlNV𒣂鐔ɂ
  ܂BM䂦ɁATCP  UDP ƔׂĂȂI[o[wbh
  傫ȂX܂B

  ATCP ɂ͎v킸ꂵȂ@\܂B1 ́A
  ̃bZ[W 1 ̃RlNVőƂƁATCP ͂Ђ
  ܂Ƃ߂ɂăobt@ɂŁAlbg[N@̃pPbg̑傫
  ł邱ƂłBbZ[WAr[ȑ傫̏ꍇ
  ́AUDP ptH[}Xo邩܂BƂ͑ɂ
  A}VԂ𕨗Iɒڐڑ邱ƂŐM̂lbg[N\z
  āATCP RlNVV~[gĂ܂@łBႦ
  ΁AParaStation ́u\PbgECuvƂC^tF[X̃\tg
  EFAg΁AłĂ܂܂B̃\tgEFÁA[Ux
  ŌĂяoƂ TCP gȂ܂BOS W̌ĂяoƈĂ_
  ́APSS ĂяoVXeR[ꂼ̑Oɂ_łB

  3.3.2.  foCXEhCo

  ۂɃf[^lbg[NƂƂ肷鎞ɁAWI UNIX ̃\tg
  EFÃC^tF[XƂȂ̂́AUNIX ̃J[l̈ꕔłfoC
  XEhCołBUDP  TCP ̓f[^`̂ł͂ȂAȂ
  ̃I[o[wbhƂȂ\Pbg̐Ă܂BႦ΁A
  TCP RlNV͕I 1 ̃lbg[NEC^tF[XL
  ƂƂ́AĂ邩ł̂łBɂЂ
  Albg[NEC^tF[Xp̃foCXEhCóA
  ̒Pȃf[^`@\KvƂ܂B̃foCXEhC
  ő@\́A[ŨvOs邱Ƃ\ŁAopen() g
  ČŗL̃foCX肵ĂAI[vut@Cvɑ΂
  read()  write() ̂悤ȃVXeR[g܂B܂肻̂悤ȑ
  ł́Af[^ubN`̂ɂقƂǃVXeR[ɂI[
  o[wbh܂B炭\}CNbxōς݂܂B

  Linux ŎgfoCXEhCô͑ςȂƂł͂܂cB
  ̃foCX̃n[hEFAǂ̂悤ɓ삷邩𐳊mɒmĂȂ
  łcBǂ̂悤ɓ삷̂młȂȂÂ͎~߂
  ł傤BfoCXEhCõfobO͂܂ȂłȂAs
  ƃn[hEFA󂵂Ă܂܂BCɂȂȂȂAf
  oCXEhCoƂ͉\łBႦ΁A@\͗Ă̂̒
  ̃C[TlbgEvgR̃I[owbhɃ}VԂɒڃRlN
  V𒣂čɒʐMp̃C[TlbgJ[hg߂ɁB
  ہA Intel  X[p[Rs[^̂łcBڂ
  Ƃ́A Device Driver HOWTO ĂB

  3.3.3.  [Ux̃Cu

  OS ɂĂ̋ے󂯂ƂȂA[UxŃn[hEF
  AEfoCX̃WX^ɊԈĂANZXĂ͂ȂAƋ
  v܂BfoCXւ̃ANZX𐧌䂷̂ OS ̏dvȖڂ 1 
  łB OS ̃VXeR[͏ȂƂ 10 }CNb̃I[
  o[wbh܂BTTL_PAPERS ̂悤ȓȃlbg[N@̂悤
  ɁA{Iȃlbg[N킸 3 }CNbȂꍇ
  ́Â悤 OS ̃VXeR[̃I[o[wbh͋e͈̔͂z
  ܂BI[o[wbhB̎íA[Ux̃R[hƃC
  ugāAn[hEFAEfoCX̃WX^ɒڃANZX邱
  łB܂ۑƂȂ̂́Aǂ烆[Ux̃Cun[h
  EFAɒڃANZXł邩ƂƂłāAOS foCX̃ANZ
  X𐧌䂷邱ƂƂǂAƂƂł͂܂B

  ʓIȃVXeŁA[Ux̃CuŒڃn[hEFÃWX
  ^ANZXB̕@́A

  1. [UEvO𓮂ɁAOS ̃VXeR[gă
     AhXԂ̃y[Wɑ݂ĂfoCX̃WX^[UvZ
     X̉zɃ}bv邱ƁBVXe̒ɂ́A mmap() VXe
     R[(ZNV 2.6 Őς)Ao̓foCX̕
     y[WAhXɑXyVEt@CɃ}bviƂ
     ǂpĂBʂ̎iƂāAfoCXEhCoāA
     ̋@\̂͂͂ȂBɂ̃foCXEhC
     o͕KvƂẴfoCX̃WX^̃y[W}bv
     ANZX𐧌ł̂ŁAOS ̃ANZX͂̂܂܂ɂĂ

  2. }bvAhXɑ΂ĒPɓǂݏ邱ƂŁAOS ̃VXe
     R[g킸ɃfoCX̃WX^ɃANZX邱ƁBႦ΁A
     *((char *) 0x1234) = 5;  5 Ƃl 1234(16 i) ɏ
     ނƂɂȂ

  KȂƂɁAIntel  386(Ƃ̌݊vZbT)ł́Aɂ܂
  @܂B
  1. ioperm() Ƃ OS  VXeR[vZXĂяo
     ƂŁAfoCX̃WX^ɑΉĂo̓AhXւ̃ANZ
     X𓾂B 1 ̕@ƂāAƎ̓[UvZ
     X(Ȃ킿u^ OSv)ŌǗ@BLinux 
     giveioperm() VXeR[
     <http://garage.ecn.purdue.edu/~papers/giveioperm.html> pb`𓖂
     Ďł

  2. OS ̃VXeR[g킸ɁA386 ̓o̓|[g߂găfoC
     X̃WX^ɃANZX邱

  2 ԖڂDꂽ@łB̓o̓foCX͕̃WX^ 1
  ̃y[WɒuĂ̂ʂŁAȂƍŏ̃eNjbNł́A
  ̃foCX̃WX^܂ܖړĨWX^̓y[Wɂ
  ɁÃANZXړĨWX^ی삷i񋟂łȂ߂
  B 386 ̃|[go͖߂ɂ}CiXʂ܂B C
  ŃR[fBOłȂ߂ɁAɂ킸łAZugKv
  邩ȂƂłBLɁA|[g 1 oCg̒l͂
  邽߂ɁAGCC Ńbp(C vOŗp\)CC̃AZ
  uR[h̊֐܂B

  ______________________________________________________________________
  extern inline unsigned char
  inb(unsigned short port)
  {
      unsigned char _v;
  __asm__ __volatile__ ("inb %w1,%b0"
                        :"=a" (_v)
                        :"d" (port), "0" (0));
      return _v;
  }
  ______________________________________________________________________

  lɁA|[g 1 oCg̒lo͂ GCC ɂ񂾃R[hL
  ɂ܂B

  ______________________________________________________________________
  extern inline void
  outb(unsigned char value,
  unsigned short port)
  {
  __asm__ __volatile__ ("outb %b0,%w1"
                        :/* no outputs */
                        :"a" (value), "d" (port));
  }
  ______________________________________________________________________

  3.4.  PVM (Parallel Virtual Machine)

  PVM(Parallel Virtual Machine)̓t[ŗpłAڐA郁b
  Z[WʐMCuŁA啔̓\Pbgx[XŎĂ܂Bb
  Z[WʐM^CṽNX^vZł́A̕WƌĂߌł
  ܂B

  PVM T|[gĂ̂́AvZbT  1 ̃}V SMP Linux }
  VA\Pbgp\ȃlbg[N(Ⴆ SLIPAPLIPAC[Tlb
  gAATM)ɐڑĂ Linux }VɂNX^łBPVM ́Av
  ZbTVXe\AgpĂ镨Iȃlbg[NقȂĂl
  Xȃ}V\ (ً@NX^ƌ܂)łĂۂɓ삷Ǝv
  ܂B܂C^[lbgoRŐڑ}V 1 ̃NX^
  ƂĈقǂ̋K͂ł삷Ǝv܂B܂APVM ̓NX^S
  ɓnĕɎsĂWu𐧌䂷@\Ă܂Bĉ
   PVM ͒Nɓn艽̐󂯂ɗpĂ(
  <http://www.epm.ornl.gov/pvm/pvm_home.html> )AʂƂĐ
  vO~ORpCAAvP[VECuAăv
  O~OfobN̂߂̃c[ł܂BĂ̐
  uڐÂ郁bZ[WʐMJ邽߂̃CuvƂĎgp
  Ă܂B܂ news O[v(comp.parallel.pvm)݂Ă܂B

  ӂKvȂ̂́APVM ̃bZ[WʐMĂяoƕWIȃ\Pb
  g̒x̑傫ɉāAɂȂ̃I[o[wbhĂ
  ܂ƂłB̏AbZ[WĂяô̂Ƃ킯ue
  ݂₷vvO~OEfł͂ȂƂɂӂKvłB

  ŏɃZNV 1.3 œoꂵ~̌vZɂāAPVM Cu
  Ăяo C go[W͉L̂悤ɂȂ܂B

  ______________________________________________________________________
  #include <stdlib.h>
  #include <stdio.h>
  #include <pvm3.h>

  #define NPROC   4

  main(int argc, char **argv)
  {
    register double lsum, width;
    double sum;
    register int intervals, i;
    int mytid, iproc, msgtag = 4;
    int tids[NPROC];  /* array of task ids */

    /* enroll in pvm */
    mytid = pvm_mytid();

    /* Join a group and, if I am the first instance,
       iproc=0, spawn more copies of myself
    */
    iproc = pvm_joingroup("pi");

    if (iproc == 0) {
      tids[0] = pvm_mytid();
      pvm_spawn("pvm_pi", &argv[1], 0, NULL, NPROC-1, &tids[1]);
    }
    /* make sure all processes are here */
    pvm_barrier("pi", NPROC);

    /* get the number of intervals */
    intervals = atoi(argv[1]);
    width = 1.0 / intervals;

    lsum = 0.0;
    for (i = iproc; i<intervals; i+=NPROC) {
      register double x = (i + 0.5) * width;
      lsum += 4.0 / (1.0 + x * x);
    }

    /* sum across the local results & scale by width */
    sum = lsum * width;
    pvm_reduce(PvmSum, &sum, 1, PVM_DOUBLE, msgtag, "pi", 0);

    /* have only the console PE print the result */
    if (iproc == 0) {
      printf("Estimation of pi is %f\n", sum);
    }

    /* Check program finished, leave group, exit pvm */
    pvm_barrier("pi", NPROC);
    pvm_lvgroup("pi");
    pvm_exit();
    return(0);
  }
  ______________________________________________________________________

  3.5.  MPI (Message Passing Interface)

  PVM ̓bZ[WʐMCu̎̕WƂȂĂ܂AMPI
  (Message Passing Interface) PVM ƔׂƐV̋KiłB MPI
  Kĩz[Ey[W  <http://www.mcs.anl.gov:80/mpi/> ŁAnews O
  [v comp.parallel.mpi łB

   MPI ɂċc_OɁAߋNɓnđ PVM  MPI 
  @푈ɂĐGꂴ𓾂ȂƎv܂B͂ǂɂg݂Ă
  Bł͂̑_ΌɂƂ邱ƂȂ܂Ƃ߂Ă݂܂B

     vZXs𐧌䂷B
        ꌾł PVM ͎Ă邪AMPI ͎Ƃ̂
        ƎdlĂȂB܂APVM ̃vO͂ǂłlɎ
        sł邪AMPI ͎ɂĂ̓삪ςĂ܂

     ً@NX^̃T|[gB
        PVM ̓[NXe[V󂢂Ă鎞ԂW߂ďƂ
        _ŐiĂ̂ŁA낢Ȏނ̃}VIy[eBOE
        VXeɊǗłBƂ͑ΏƓIɁAMPI
        ͎Ƃă^[Qbg MPP(Massively Parallel Processor) 
        ́ANX^pɎg铯ނ̃[NXe[VɓĂĂ
        

     łłǌQB
        PVM ͖ړIɑ΂ĈтĂBꂪ MPI 2.0 ɂ͌Ă
        BMPI 2.0 ̐VKíA̋@\𐷂荞łA{I
        bZ[WʐMf͂邩ɉzĂ܂ĂBႦ
        RMA(Remote Memory Access)t@Co͂Ȃǂɓ
        B{ɖɗ̂낤H 񂻂́c MPI 2.0
        ́AVvO~OɏK邮炢wKKvɂ
        

     [UEC^tF[X̐݌vB
        MPI ̐݌v PVM VA PVM ̐݌vmɎQlɂĂ
        BMPI ̓VvIȃobt@@\A̍x̒
        ɂă[U`f[^\bZ[Wɓē`ł
        

     ẲéB
        Ƃł́AMPI ƔׂƂ܂ PVM ̕낢ƍl
        Ă_B PVM  MPI ɈڐA邱ƂȒPł
        邱ƁAMPI ȕWƂčLxĂ邱ƂA@
        ւɂƂĂ MPI gp邱Ǝ̂|V̂̂ɂȂĂ

  _́H Ƃ₢ɑ΂ẮAt[Ŏg MPI  3 ƗĊJ
  ĂāALinux ̃NX^܂AƓĂ܂B (̒ 1
  ͎܂)

  o  LAM(Local Area Multicomputer) MPI 1.1 KiɊSɏĂ
     BMPI vOAX^hA[ Linux VXe  UDP 
     TCP x[X̃\PbgʐMg Linux VXeō\zNX^
     œ삷BVXeɂ͗lXȃvOJfobNx
     c[ƂƂɁAȒPȎs@\B
     <http://www.mpi.nd.edu/lam/> t[ŗp\

  o  MPICH(MPI CHameleon) MPI 1.1 KiɊSɏĂāAڐAl
     Đ݌vĂBLAM ƓlɁAMPI vOX^hA[
      Linux VXe  UDP  TCP x[X̃\PbgʐMg Linux
     VXeō\zNX^œ삷B MPI IړI
     ɑ΂ď_ɑΉ邱Ƃɏd_Ă̂͊ԈႢȂB
     MPI ̎ڐAɂ́Au`lEC^tF[Xv 5 ̊֐
     ƃptH[}X̂߂ MPICH ADI(Abstract Device Interface)
     邱ƂɂȂB MPICH ɂĂ̂ɏڂƂ̈ڐA@
     ɂẮA <http://www.mcs.anl.gov/mpi/mpich/> Œm邱Ƃł
  o  AFMPI(Aggregate Function MPI) MPI 2.0 KĩTuZbgŁA
     BAFAPI x[Xɍ\zĂAx̏ȂWʐM RMA 
     {ƂȂ悤ɐ݌vB MPI ̃f[^^CvʐMi
     ͍Œ̂̂񋟂ĂȂBX^hA Linux VXe
     AFPI płlbg[N@ŐڑĂNX^ɂ
     āAMPI g C vO삷B
     <http://garage.ecn.purdue.edu/~papers/> t[ŗp\

   MPI ̎(̑)̂ǂ𗘗pĂAʏg^Cv̒ʐM
  ȂȒPɎsł܂B

   MPI 2.0 ɂ͒ʐMp_CAꂪ{IɈ
  ɂȂĂ邽߁AvO}[p_CgpĂ MPI ̑
  R[fBOł͗płȂꍇ܂B 1 ̃vO
  AMPI T|[gĂ鍪{IɈقȂĂʐMp
  _Cꂼɂė𗧂ł傤B3 ̃vO
  ׂẮA HOWTO ʂĎgpĂ~̌vZ{IȃA
  SY (ZNV 1.3 )ŎĂ܂B

  ŏ MPI ̃vÓA{I MPI ̃bZ[WʐMĂяogp
  āAꂼ̃vZbTv 0 Ԃ̃vZbTɑāÃv
  ZbTvČʂo͂܂B

  ______________________________________________________________________
  #include <stdlib.h>
  #include <stdio.h>
  #include <mpi.h>

  main(int argc, char **argv)
  {
    register double width;
    double sum, lsum;
    register int intervals, i;
    int nproc, iproc;
    MPI_Status status;

    if (MPI_Init(&argc, &argv) != MPI_SUCCESS) exit(1);
    MPI_Comm_size(MPI_COMM_WORLD, &nproc);
    MPI_Comm_rank(MPI_COMM_WORLD, &iproc);
    intervals = atoi(argv[1]);
    width = 1.0 / intervals;
    lsum = 0;
    for (i=iproc; i<intervals; i+=nproc) {
      register double x = (i + 0.5) * width;
      lsum += 4.0 / (1.0 + x * x);
    }
    lsum *= width;
    if (iproc != 0) {
      MPI_Send(&lbuf, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
    } else {
      sum = lsum;
      for (i=1; i<nproc; ++i) {
        MPI_Recv(&lbuf, 1, MPI_DOUBLE, MPI_ANY_SOURCE,
                 MPI_ANY_TAG, MPI_COMM_WORLD, &status);
        sum += lsum;
      }
      printf("Estimation of pi is %f\n", sum);
    }
    MPI_Finalize();
    return(0);
  }
  ______________________________________________________________________

  Ԗڂ MPI ̃o[ẂAWʐM(̓prɑ΂čœK)
  gĂ܂B

  ______________________________________________________________________
  #include <stdlib.h>
  #include <stdio.h>
  #include <mpi.h>

  main(int argc, char **argv)
  {
    register double width;
    double sum, lsum;
    register int intervals, i;
    int nproc, iproc;

    if (MPI_Init(&argc, &argv) != MPI_SUCCESS) exit(1);
    MPI_Comm_size(MPI_COMM_WORLD, &nproc);
    MPI_Comm_rank(MPI_COMM_WORLD, &iproc);
    intervals = atoi(argv[1]);
    width = 1.0 / intervals;
    lsum = 0;
    for (i=iproc; i<intervals; i+=nproc) {
      register double x = (i + 0.5) * width;
      lsum += 4.0 / (1.0 + x * x);
    }
    lsum *= width;
    MPI_Reduce(&lsum, &sum, 1, MPI_DOUBLE,
               MPI_SUM, 0, MPI_COMM_WORLD);
    if (iproc == 0) {
      printf("Estimation of pi is %f\n", sum);
    }
    MPI_Finalize();
    return(0);
  }
  ______________________________________________________________________

  OԖڂ MPI ̃o[ẂAMPI 2.0  RMA ̋@\gāAꂼ
  vZbT[J lsum  0 Ԃ̃vZbT sum ɉZ܂B

  ______________________________________________________________________
  #include <stdlib.h>
  #include <stdio.h>
  #include <mpi.h>

  main(int argc, char **argv)
  {
    register double width;
    double sum = 0, lsum;
    register int intervals, i;
    int nproc, iproc;
    MPI_Win sum_win;

    if (MPI_Init(&argc, &argv) != MPI_SUCCESS) exit(1);
    MPI_Comm_size(MPI_COMM_WORLD, &nproc);
    MPI_Comm_rank(MPI_COMM_WORLD, &iproc);
    MPI_Win_create(&sum, sizeof(sum), sizeof(sum),
                   0, MPI_COMM_WORLD, &sum_win);
    MPI_Win_fence(0, sum_win);
    intervals = atoi(argv[1]);
    width = 1.0 / intervals;
    lsum = 0;
    for (i=iproc; i<intervals; i+=nproc) {
      register double x = (i + 0.5) * width;
      lsum += 4.0 / (1.0 + x * x);
    }
    lsum *= width;
    MPI_Accumulate(&lsum, 1, MPI_DOUBLE, 0, 0,
                   1, MPI_DOUBLE, MPI_SUM, sum_win);
    MPI_Win_fence(0, sum_win);
    if (iproc == 0) {
      printf("Estimation of pi is %f\n", sum);
    }
    MPI_Finalize();
    return(0);
  }
  ______________________________________________________________________

  MPI 2.0 Ɋ܂܂ RMA ݂̂AlXȃvZbT̈قȂ郁
  ݂铯KvƂf[^\ŁAƂȂ肻ȂƂ
  IɋĂ_͊oĂĂ͂܂B́Auwindowv
  Ƃ邱ƂŉĂ܂Bwindow ɂ́Ax[XAhẌO
  ւ̃ANZXh~ɉāApAhẌ̕ύXs@\܂Ŋ܂ł
  ܂BRMA IȂ̂́A MPI_Win_fence Ăяo܂Ŏۂɂ͖
  ߂sȂ_ɂ܂Bv񂷂ƁARMA ݂̂́AUL
  ƃbZ[WʐMIɑgݍ킹̂łAC^tF[XƂ
  ŔɌIɒʐMł\߂Ă܂B

  3.6.  AFAPI (Aggregate Function API)

  AFAPI(Aggregate Function Application Program Interface) PVM  MPI
  Ƃ͈ႢAڐÂ钊ۓIȃC^tF[X̃lbg
  [N@\tgEFAɍ\z悤ƂĐɏo킯ł͂܂
  BAFAPI ͂ނn[hEFAɂƂĂˑ჌xȃCu
  ŁAPAPERS(Purdue's Adapter for Parallel Execution and Rapid
  Synchronization  <http://garage.ecn.purdue.edu/~papers/> Q)płB

  PAPERS ɂĂ̓ZNV 3.2 ŊȒPɏqׂ܂ApubNEh
  CŐ݌vlbg[NŁAƎ̏WZAx͂킸~
  bxōςł܂܂B PAPERS ŏdvȂ̂͂̓_ł͂
  A1 ̃X[p[Rs[^グړIŊJsꂽ_ɂ
  ܂B͊̃X[p[Rs[^ΏۂɂƂARp
  CZp𐶂ƂăX[p[Rs[^ΏۂƂ܂B
  Linux NX^̑啔Ƃ݂APVMAMPI ̂悤ɕWIȃlbg
  [NgĔrIxeAvP[V𗘗p邱Ƃɏœ_
  𓖂Ă̂Ƃ͎IɈقȂĂ܂BLinux PC  PAPERS VXe̍\
  vfƂč̗p̂́AłpΌʂƂ@Ńvg^Cv
  ʂɉ߂܂B

  lXɈقȂvg^Cv̎ɑ΂āAʂɎg჌xȃ\tg
  EFAKvƂꂽƂAPAPERS Cuō쐬̂ AFAPI
  ̕WƂ܂B AFAPI ŎgpĂ郂f͂Vv
  ŁA񉻃RpCŃRpĈ SIMD A[LeN`pɍ
  AxׂʂɓKĂ܂BfVvȂƂŁA
  PAPERS ̃n[hEFAeՂɍ\zł邾łȂASMP ̗̑lX
  n[hEFAւ AFAPI ̈ڐAAv̂قIɍs܂B

  AAFAPI  TTL_PAPERS  CAPERSAWAPERS ŐڑĂ Linux N
  X^œ삵Ă܂B܂ SHMAPERS Ƃ System V ̋LC
  ugāASMP VXełlɓ삵Ă܂(OS ̃VXeR[
  gpȂ΂肩AoXbN閽߂g킸ɁBZNV
  2.2 Q)B Linux NX^ UDP ̃u[hLXggĕʂ
  lbg[N (Ⴆ΃C[Tlbg)œo[W͊JłB
  [XׂẴo[ẂA
  <http://garage.ecn.purdue.edu/~papers/> Ă܂BAFAPI 
  ׂẴo[ẂAC  C++ Ăяo悤ɐ݌vĂ܂B

  ̃vÓAZNV 1.3 łA~vZ AFAPI o[
  WłB

  ______________________________________________________________________
  #include <stdlib.h>
  #include <stdio.h>
  #include "afapi.h"

  main(int argc, char **argv)
  {
    register double width, sum;
    register int intervals, i;

    if (p_init()) exit(1);

    intervals = atoi(argv[1]);
    width = 1.0 / intervals;

    sum = 0;
    for (i=IPROC; i<intervals; i+=NPROC) {
      register double x = (i + 0.5) * width;
      sum += 4.0 / (1.0 + x * x);
    }

    sum = p_reduceAdd64f(sum) * width;

    if (IPROC == CPROC) {
      printf("Estimation of pi is %f\n", sum);
    }

    p_exit();
    return(0);
  }
  ______________________________________________________________________

  3.7.  NX^T|[gĂ邻̑̃Cu

  PVM  MPIAAFAPI ɉāAL̃Cu񋟂@\ Linux V
  Xeō\zNX^ŕ񏈗ŝɖ𗧂܂B
  hLgł͂̃VXeɂĂ͊ȒPɐG邾ɗ߂܂B
  R͊ȒPŁAPVM  MPIAAFAPI ƈႢAقƂǂ܂ƌĂ
  قǂ̃VXe Linux NX^łɈƂȂ
  łB̃Cu₻̑Cu̒ŁA͗LAƎv
  ̂ȂAǂɓdq[𑗂ĂB𔭌
  ĂApplinux@ecn.purdue.edu ܂ł肢܂B
  ÃCũZNV̕ƂĒǉłB

  3.7.1.  Condor(vZXE}CO[VT|[g)

  Condor ͕UĂ郊\[X̊ǗsVXeŁA[NXe[V
  ō\ĂK͂Ȉً@NX^Ǘł܂BvZ𒆐Sɒ
  ԂKvƂ̏s[UANX^̗]Ă\͂
  pAƂvɓׂ݌vsĂ܂BCondor ̓vZ
  XۂɎs}VɌXsĂ}V̊L͈͂ɕێ
  Ă܂BƂ̃}VƎۂɎs}Vʂ̃t@CEV
  XepX[ĥ݂ʂɎĂȂĂłBŏIIɃWu
  ̏Iۏ؂Kv̂ŁA1 ̃vZXȂ Condor ̃Wu
  ͎IɃ`FbN|CgA[NXe[VԂŃ}CO[V
  ܂B

  y󒐁FuvZXE}CO[VvƂ́A}VŎsĂv
  ZX𑼂̃}VɈpŁAs邱ƂłBu`FbN|
  CgvƂ́Ã݂vZXf[^̏Ԃŗp邽߂ɋL^
  Ƃłz

  Condor   <http://www.cs.wisc.edu/condor/> 痘pł܂B Linux
  ւ̈ڐA܂Bɏڂ
  <http://www.cs.wisc.edu/condor/linux/linux.html> y󒐁FN؂z
  ɂ܂Bڍׂ́Acondor-admin@cs.wisc.edu ɘAĂB

  3.7.2.  DFN-RPC (German Research Network - Remote Procedure Call)

  DFN-RPC(German Research Network Remote Procedure Call)́AȊwZpAv
  P[VEvOŁA[NXe[VƌvZT[o̓N
  X^ԂŕUA񏈗sړIŊJ܂BC^tF[X
  ́AFortran ŏAvP[VɍœKĂ܂A DFN-RPC 
  C ̊Jłpł܂BLinux ɂڐAĂ܂Bɏڍׂ
  ́A <ftp://ftp.uni-
  stuttgart.de/pub/rus/dfn_rpc/README_dfnrpc.html> ɂ܂B

  3.7.3.  DQS (Distributed Queueing System)

  mɂ̓Cuł͂Ȃ̂łADQS 3.0(Distributed Queueing
  System) ̓WuL[COVXełBLinux ŊJAeXg
  Ă܂Bً@NX^P̃VXeƂėpAǗł悤
  ɐ݌vĂ܂B <http://www.scri.fsu.edu/~pasko/dqs.html> 痘
  pł܂B

  płACODINE 4.1.1(COmputing in DIstributed Network
  Environments) Ƃ܂B <http://www.genias.de/genias_welcome.html>
  ɏ񂪂܂B

  3.8.  p\ȃNX^̈ꗗ

  NX^͂낢ƈقȂ@ō\zA^pł̂ŁANX^̊J
  v鋻[sĂO[vȂ肠܂BL̈ꗗ
  ŁANX^֘ÃvWFNg̒ŊF񂪋ł낤Ǝv
  ̂Ă܂Bɂ́ALinux ŗL̂́ANX^ʂ
  ̂܂܂Ă܂BXg̓At@xbgłB

  3.8.1.  Beowulf

  Beowulf vWFNg( <http://www.beowulf.org/>) ́AŝĂ PC
  x̃n[hEFAƍLш敝NX^gݍ݂̃lbg[NA
   Linux Iy[[eBOEVXex[XɂĂ܂B̂
  Ȏŝ̃[NXe[VgăNX^gނ߂̃\tgEFA
  쐬邱ƂɃ^[Qbg𓖂ĂĂ܂B

  Thomas Sterling  Beowulf 𐄐iĂāAȊwvZʂɂĂ
  Linux NX^OɂẮAYقȗi҂ł܂B
  ɑ̃O[ṽNX^uBeowulf NX́vVXeƌ
  ł܂B{͂̃NX^ Beowulf ̐݌vɂقǎĂ
  Ȃɂ炸B

  Don Becker  Beowulf vWFNg̃T|[gĂāAʓI
  Linux ŗp\ȃlbg[NEhCo쐬Ă܂B̃h
  Cȏ BSD łpĂ܂Bނ͂̃lbg[NEh
  Cȏ̕ڑ𕉉וUALш敝ȃXCb`
  OEnuɎ邱Ƃɑ΂ĂӔC𕉂Ă܂B̃^Cv̕
  וÚAX Beowulf NX^ɓƎ݂̂łB

  3.8.2.  Linux/AP+

  Linux/AP+ vWFNg( <http://cap.anu.edu.au/cap/projects/linux/>)
  ́A Linux ̃NX^Oł͂܂񂪁ALinux xmʂ
  AP1000+ ɈڐAāA}VɌ񏈗@\̊gڎwĂ
  BAP1000+ ͎ŝ SPARC x[X̕}VŁAg[X\̓
  lbg[NAш敝 25 MB/bAx 10 ~bc܂ SPARC
  x[X Linux NX^ɂłB

  y󒐁Fg[X\X[p[Rs[^̃C[W IBM
  Bluegene <http://www.research.ibm.com/bluegene/original_pictures.html>
  Ăz

  3.8.3.  Locust

  Locust vWFNg( <http://www.ecsl.cs.sunysb.edu/~manish/locust/>)
  y󒐁FN؂źAUzLVXe\zĂ܂BR
  pCɌ肷gpāAbZ[W̒x݉Ɏ
  s̃lbg[N̗ʂ炵Ă܂BPupa  Locust ̊{ʐMT
  uVXeŁAC[Tlbgg FreeBSD 삵Ă 486 PC 
  Ă܂BLinux ͂킩܂B

  3.8.4.  Midway DSM(UL)

  Midway(
  <http://www.cs.cmu.edu/afs/cs.cmu.edu/project/midway/WWW/HomePage.html>)
  ́ATreadMarks(q)Ƃ͈ႢA\tgEFAx[X DSM(UL)
  VXełBy[WEtHĝ悤ɒx݂ł͂ȂARpC
  ̏𗘗pĂAt[ɗpł_ǂ̂łAcOȂ
  Linux NX^ł͓܂B

  3.8.5.  Mosix

  MOSIX  BSDI  BSD/OS ɎāAIȃ[hEoVOƃlb
  g[NŃO[vgł PC ԂŃvGveBuɃvZXE}
  CO[Vł悤ɂĂ܂B͕񏈗ɂĂƂ
  킯ł͂܂񂪁Ag SMP ̂悤ȃNX^ŗp
  ɓKĂ܂BLinux o[W͏ôH Ƃɂ铚́A
  <http://www.cs.huji.ac.il/mosix/> ɂ܂B

  3.8.6.  NOW (Network Of Workstations)

  Berkeley  NOW(Network Of Workstations)vWFNg(
  <http://now.cs.berkeley.edu/>)́Albg[NɐڑĂ郏[NX
  e[VgāAvZs𐶂ݏo܂B̌
  pĂAu100 ̃vZbTڂpIȃVXeN
  ؂vƂɖڕW߂Ă܂B߂Ƃ Linux ͎gĂ܂
  B

  3.8.7.  Linux g񏈗

  Linux g񏈗 WWW TCǵA
  <http://yara.ecn.purdue.edu/~pplinux/> ɂ܂B́A HOWTO
  ̃z[ŁÂɊۈ悤ȃ`[gÃXCh܂ނ
  ̊֘AhLg܂BPAPERS vWFNg̊ł
  ȂAp[fw School of Electrical and Computer Engineering
  ́A񏈗̃[_[Iȑ݂łB̃TCgĴ݂́AF
  Linux PC ŕ񏈗菕邽߂łB

  p[fw̍ŏ Linux PC ̃NX^ 1994 N 2 ɑgݗĂ
  ĈȗALinux PC NX^p[fwłgݗĂ܂B
  ̒ɂ̓rfIEEH[VXe܂B
  ̃NX^́A386  486APentium VXe(Pentium Pro VXe͂
  ܂)g܂Aŋ߂ɂȂ Intel p[fwɊtĂ
  ܂B̊t Pentium II VXegK͂ȃNX^𕡐
  \zł悤ɂȂ܂(165 ̃}V 1 ̃NX^\z
  v悠)BɃNX^ׂ͂ PAPERS ̃lbg[Nɐڑ\
  ŁA̓̑啔͂܂ł̃lbg[NɂڑĂ܂B

  3.8.8.  Pentium Pro NX^̃Z~i[

  1997 N 4  10A11 ɃACIB̃fC AMES ÂŁA
  Pentium Pro NX^̃Z~i[J܂B̃Z~i[̕
  ́A <http://www.scl.ameslab.gov/workshops/PPCworkshop.html> ɂ
  B PC NX^ɂďoȎ҂ׂĂW߂̕ɂɂȂ
  ܂B

  3.8.9.  TreadMarks DSM (UL)

  DSM(UL)́AbZ[WʐMVXeASMP ̂Ƃӂ܂
  ZpłB̂悤ȃVXe͂Ȃ葽ÂقƂǂ OS 
  y[WEtH[ĝ݂𗘗păbZ[WʐM͂߂܂B
  TreadMarks( <http://www.cs.rice.edu/~willy/TreadMarks/overview.html>)
  ́Â悤ȃVXe̒łIŁALinux NX^ł삵
  BuTreadMarks ͑wcgDɑ΂Ă킸ȔpŔzzv
  Ƃ_cOȂƂłBɂ̃\tgEFAɂĂ̒m肽
  A treadmarks@ece.rice.edu ɘAƂĂB

  3.8.10.  U-Net (User-level NETwork interface architecture)

  U-Net(User-level NETwork interface architecture)vWFNg̓R[l
  w  <http://www2.cs.cornell.edu/U-Net/Default.html> ōsĂ
  Bŝ̃lbg[N@gălbg[NEC^tF[Xz
  AȂxƍLш敝񋟂Ă܂B̉zC^tF[X
  āAAvP[V̓Iy[eBOEVXeʂƂȂA
  bZ[W𑗎Mł܂BU-Net ́ADEC  DC21140 `bvڂĂ
  t@[XgEC[TlbgJ[h Fore Systems  PCA-200(PCA-200E 
  ͂Ȃ) ATM J[hg Linux NX^œĂ܂B

  y󒐁FJ҂JtHjAw̃o[NCZɈٓ Web T
  Cg <http://www.cs.berkeley.edu/~mdw/projects/unet/> ɈڂĂ
  z

  3.8.11.  WWT (Wisconsin Wind Tunnel)

  EBXRVwł́ANX^֘ǍƂĂɍsĂ
  B WWT(Wisconsin Wind Tunnel)vWFNg(
  <http://www.cs.wisc.edu/~wwt/>)́ARpCƕ񏈗̊ՂƂȂ@
  Ԃ́uWIvȃC^tF[XJɊ֘A邷ׂĕŌs
  ܂BWisconsin COW(Cluster Of Workstations)́ACooperative Shared
  Memory  TempestAParadyn Parallel Performance Tools JĂ
  BcOȂALinux ɂĂ͂܂GĂ܂B

  y󒐁FParadyn  Wisconsin Wind Tunnel ́AƗvWFNg
  jbNl[łBCooperative Shared Memory ́A\tgEFAŃf[^
  ωǗAL̃n[hEFAP܂BTempest ́Av
  OARpCACuɃbZ[WʐMⓧߓIȋLA
  ͂̑gݍ킹񋟂C^tF[XłBParadyn Parallel
  Performance Tools ́AvO}ɑ΂ăvO̒xI
  oA̖_ɂĂ̏vO}ɗ^A`[jO̎菕
  sc[łz

  4.  SIMD Within A Register(Ⴆ MMX 𗘗p)

  SIMD(Single Instruction stream, Multiple Data stream) Within A
  Register(SWAR)́AVACfBAł͂܂Bk rbg̃WX^
  f[^pXAZu}Vł́AʓIȃWX^́A SIMD 
  񏈗œƂmĂ܂B܂ k/n rbg̐̈̒l
   n sł܂Bŋ߂ɂȂ SWAR Zpɂă}`
  fBA 2 { 8 {ȂƂŁA̋ZpRs[eB
  ÕCXg[Ŋ֐S悤ɂȂ̂ɉ߂܂B1997
  N_ł̃}CNvZbT̂قƂǂ́Agݍ݂̃n[hEFA
  SWAR T|[gĂ܂B

  o  AMD K6 MMX (MultiMedia eXtensions)

  o  Cyrix M2 MMX (MultiMedia eXtensions)

     y󒐁FVIA  Web TCg̓IChLg̒񋟂~Ă
     ܂z

  o  Digital Alpha MAX (MultimediA eXtensions)

     y󒐁FMAX  MVIƂ̂ɕύXĂ܂z

  o  Hewlett-Packard PA-RISC MAX (Multimedia Acceleration eXtensions)
     y󒐁FN؂z

  o  Intel Pentium II & Pentium with MMX (MultiMedia eXtensions)

  o  Microunity Mediaprocessor SIGD (Single Instruction on Groups of
     Data)

  o  MIPS Digital Media eXtension (MDMX, pronounced Mad Max)y󒐁F
     N؂z

  o  Sun SPARC V9 VIS (Visual Instruction Set)

  V}CNvZbT񋟂Ăn[hEFA@\ɂ́AɔɂȂ
  ĂAtB[h̑傫̂߂ɕKvȑ̂悤Ȃ
  ̂͂قƂǂ܂Bdvȓ_́ASWAR ̑Iŝɂ
  Ȃn[hEFÃT|[gKvȂƂƂłBႦ΁A_I
  1 ̃WX^𕪊ĂArbgƂ̉Zɂ͉eł܂B

  4.1.  SWAR ̉DĂ̂H

  ŋ߂̃vZbTł΂ǂłꏭȂ SWAR ̕񏈗@\
  ܂BcOȂƂɁASWAR ő啝ɋ@\ꂽ߃ZbgA
  ėpIɕ񏈗ɓKpł킯ł͂܂Bۂɂ́AF
  Pentium ƁuMMX Pentiumv̐\̈Ⴂ́AMMX ꂽƓɓ
  ꂽ傫 L1 LbV̂ł邱ƂɋCÂĂƎv
  ܂B{̂ƂASWAR( MMX)͉ǂ̂ł傤H

  o  f[^͐̂݁BΏǂB32 rbg̒l 2 A 64
     rbg MMX WX^ɂ͂傤ǂA8  1 oCg̃LN
     ^ 1 rbg̒l`FXՂɒlU炷悤ɃZbg

     ӁF_ł MMX悤ALqĂ鎞_
     ́Aق̏o܂ĂȂƌĂBCyrix ͈ȑO\
     XCh( <ftp://ftp.cyrix.com/developr/mpf97rm.pdf>) y󒐁F
     N؂z̒ŁAMMFP ɂăRgĂB MMFP  2 
     32 rbglpbN 64 rbg MMX WX^ɔ[߁A
     ܂Ƃ߂ 2  MMFP pCvCɗANbN 4 
     Px_ZT|[gƂĂB

     y󒐁F2001.3 ݁ACyrix( VIA P)̃vZbTł̋@\
     Ă̂͂܂񂵁A\\Ă܂z

  o  SIMD ̓xNg^̕񐫁B삪ׂẴtB[hɑ΂
     ēɔBtB[ȟʂ𖳌ɂ(܂ASIMD 
     }XLO邱ƂƓ)i邪AR[fBOGɂȂ
     ptH[}Xቺ肷

  o  [JŋKI(pbNĂ΂Ȃǂ)Qƃp^[B
     SWAR SʁA MMX ̓_ȏŃANZXƂƂłȂ
     ƂɂȂBx[y](y CfbNX̔z)̂悤ȃxNgW߂Ă鏈
     ͂ƂĂdȂ

  ̐͐[łÃ^Cv̕񐫂̓}`fBÃAv
  P[VłȂAASYł͂悭邱ƂłBAS
  Ỹ^CvK؂ł΁ASWAR ́ASMP  NX^̕񐫂L
  AgpɓĂ܂p܂B
  4.2.  SWAR vO~O

  SWAR(SIMD Within A Register)̊{IȃRZvǵA[hWX^
   nk/n rbg̃tB[hl SIMD ̕񉉎Z邱ƂŁAvZ
  xコ_ɂ܂BA SWAR Zp͈Â炭A SWAR
  ̉Z͓lȉZsZAčŝƔׂďdȂ
  B SWAR ̉Zɂ́AtB[h𕪊閽߂ɉ邽
  łB

  ̓_̂ɁASWAR ݂̂ȂPčlĂ݂邱Ƃ
  ܂傤B4  8 rbgtB[h 32 rbg̃WX^
  Ƃ܂B 2 ̃WX^̒ĺAL̂悤ɂȂ܂B

  ______________________________________________________________________
           PE3     PE2     PE1     PE0
        +-------+-------+-------+-------+
  Reg0  | D 7:0 | C 7:0 | B 7:0 | A 7:0 |
        +-------+-------+-------+-------+
  Reg1  | H 7:0 | G 7:0 | F 7:0 | E 7:0 |
        +-------+-------+-------+-------+
  ______________________________________________________________________

  ̊ȒPȐ}͂ꂼ̃WX^ 4 ̓Ɨ 8 rbg̒l̃xNg
  邱Ƃ\Ă܂BA  E  Reg0  Reg1 ̃vZbVOG
  g 0(PE0)AB  F  PE1 ̃WX^lƂȂ܂B̑̍
  ڂlłB

  ̌hLgł SIMD 񏈗𕪗ނAxNg֐ǂ
  悤ɎĂ邩̐xNgɂĊTςĂ܂B

  4.2.1.  |tBbNȑ

  SWAR ̑̂́Aʏ 32 rbg̑삻̂܂܂ɏ
  Bۂɂ́Ȃ삪񂵂ēƗ 8 rbg̃tB[h
  삷邱ƂƂ͖֌WłB̂悤 SWAR ̑̂Ƃ|tBbN
  ƌĂł܂B̑삪tB[h̃^Cv(TCY) ɉeȂ
  ߂łB

  ǂ̃tB[h[łȂeXĝ́AׂĂɑ΂ărbg_
  Z_Ń|tBbNȑƌ܂BႦ΁Aʏ̃rbg_
  ωZ(C  & Zq)̓tB[h̑傫łĂArbg
  ZƂȂ܂BPȃrbg_ωZL̃WX^ōsƉL̂悤
  ɂȂ܂B

  ______________________________________________________________________
            PE3       PE2       PE1       PE0
        +---------+---------+---------+---------+
  Reg2  | D&H 7:0 | C&G 7:0 | B&F 7:0 | A&E 7:0 |
        +---------+---------+---------+---------+
  ______________________________________________________________________

  rbg_ωZ͏ɃIyhErbg k ƂlɂE
  k ƂrbglɂȂ̂ŁAtB[h̑傫ׂ͂ē 1 ̖
  găJo[ł܂B

  4.2.2.  

  ɂ SWAR ŏdvȂ̂̒ɂA|tBbNłȂ삪
  񂠂܂BlẐ悤ȎZpZł́AtB[hԂŌ̏グ
  Kv܂B̂悤ȑ SWAR ōsƂuv
  Ăł܂BŔÂ悤ȑ삪Iyh⌋ʂ𕪊
  āAtB[hԂ̂肭hȂ΂ȂȂłBۂ̌
  𐶂ނ̂ɂ 3 ̈قȂ@܂B

  4.2.2.1.  

  炭A̒ōł₷@́Au񖽗
  (partitioned parallel instruction)vn[hEFAŃT|[g邱Ƃ
  傤BŃtB[hԂ̌̏グr܂B̕@g
  ptH[}X͕Ȃオ܂AvZbT̖߃ZbgύX
  AtB[h̑傫ɑ΂Ă̐Ă܂܂ (Ⴆ΁A8
  rbg̃tB[h̓T|[gĂA12 rbg͑ʖڂłƂ)B

  AMD  CyrixAIntel  MMX  Digital  MAXAHP  MAXA Sun  VIS
  ׂẮA߂̎ɐ܂BcOȂƂɁAꂼ̖
  Zbgg͐ɂĂقȂĂ̂ŁÅԂł͎
  łASYɈڐAȂȂĂ܂BႦ΁ALŕ
  ̈ꕔĂ݂܂傤B

  ______________________________________________________________________
    Instruction           AMD/Cyrix/Intel MMX   DEC MAX   HP MAX   Sun VIS
  +---------------------+---------------------+---------+--------+---------+
  | Absolute Difference |                     |       8 |        |       8 |
  +---------------------+---------------------+---------+--------+---------+
  | Merge Maximum       |                     |   8, 16 |        |         |
  +---------------------+---------------------+---------+--------+---------+
  | Compare             |           8, 16, 32 |         |        |  16, 32 |
  +---------------------+---------------------+---------+--------+---------+
  | Multiply            |                  16 |         |        |    8x16 |
  +---------------------+---------------------+---------+--------+---------+
  | Add                 |           8, 16, 32 |         |     16 |  16, 32 |
  +---------------------+---------------------+---------+--------+---------+
  ______________________________________________________________________

  ̕\ł͐tB[h̑傫rbgŕ\ĂāA̒lłꂼ
  ̑삪\ɂȂĂ܂BƋ[߂ȂǑ̖߂\ɂ
  ڂĂ܂񂪁A̕\łႢ̑傫͖炩łB_Ƃ
  ́A炩ɍ(HLL)̓vO~OEfƂĂ܂ɗ
  AڐAقƂǂȂƂłB

  4.2.2.2.  R[hCāA߂gȂ

  ߂gΊmɌʂオ܂AKv
  ƂĂ镪n[hEFAT|[gĂȂǂȂ
  傤H ́Aʏ̖ߌQgătB[hԂŌ̏グs
  sAtB[hԂł̗]vȂƂ𐳂܂B

  ̎i͂܂Ƀ\tgEFAɂ̂ŁACɂI[o[wbh
  ܂BAŔėpIɃtB[h̕\ɂȂ܂B
  @͔ɔėpIŁAn[hEFA̕߂̈Ⴂ𖄂߂邾ł
  A܂n[hEFÃT|[ĝȂ}Vɑ΂Ă@\tɒ
  ł܂Bۂɂ́AC ̂悤ȃvO~OŃR[h
  ŁASWAR vO͂ƂĂڐA₷Ȃ܂B
  ŋ^₪Ă܂BSWAR ̕g킸ɃR[hCăV
  ~[gꍇAmɂǂ̂炢̂ł傤HƂ
  ˂łcAF񂪎vĂقǓ삪킯
  ł͂܂B

  4 ̗vf 8 rbg̐xNg 2  32 rbggĉ
  Z(x+y)邱ƂlĂ݂܂傤B

  ʏ 32 rbgZ͐mȒlɂȂƎv܂A͂ǂ 8 rbg
  tB[h̃tB[hɉe^ȂꍇłBāAŏII
  ɂ͂̂悤Ȍオ肪܂NȂƂۏ؂Ȃ΂܂
  B k rbg̃tB[hZƁAĂ k+1 rbglɂȂ
  ŁAオ͒Pɂꂼ̃tB[h̍ŏʂ̃rbgu}XN
  邱ƁvŖh܂B͂ꂼ̃Iyhɑ΂ 0x7f7f7f7f 
  rbgPʂŘ_ςAʏ 32 rbgZ OK łB

  ______________________________________________________________________
  t = ((x & 0x7f7f7f7f) + (y & 0x7f7f7f7f));
  ______________________________________________________________________

  ŁAꂼ̃tB[h̍ŏʃrbgĐmȒlł܂B
  ꂼ̃tB[h̒l𐳊mɌvZɂ́Ax  y 2 ɕꂽ
  ŏʂ 1 rbg̒l 7 rbgŌvZ t ɉZ邾łBs
  ̂ƂɁA 1 rbg̉Z͒ʏ̔r_aZƂĎ
  Ă܂B܂Aʂ͒PɉL̂悤ɋ߂܂B

  ______________________________________________________________________
  (t ^ ((x ^ y) & 0x80808080))
  ______________________________________________________________________

  Ȃɂ₳͂ȂłˁBǂ傤 4 ̉Z 6 ̑삪K
  vłBẢ񐔂̓tB[h̐ǂ̂炢邩cƂ
  ƂƂ͊֌WȂƂɒӂĂBtB[hxオ
  ܂BƂɂۂɑxサ܂B̓tB[h 1 ̑(
  xNg)Ń[hXgA邱ƂŁAWX^𗘗p銄
  AIɃR[hŝɕKvȃXPW[Öˑ֌WقƂ
  ǂȂȂ邩ł(Iȃ[hւ̎QƂ邽)B

  4.2.2.3.  tB[hl̐

  L 2 ̕@ƂAŃWX^őp悤Ɏs
  ̂ɑ΂āA̕@ł̓tB[h̒l𐧌䂷邱ƂŁAIɌv
  ZsAtB[hԂ̌̏グċNȂ悤ɂ܂B
  ΁AZtB[hׂĂɂăI[o[t[ȂƂ
  ĂꍇẢZ͒ʏ̉Z߂gĎsł܂B
  ۂ̐񉺂Œʏ̉Z߂̓|tBbNƂȂAR[hC邱
  ƂȂɂǂȃtB[h̑傫łpł邱ƂɂȂ܂BŖ
  Ȃ̂́AǂtB[h̒lԂŌ̏㉺NȂmF
  @łB

  ̓mF@ 1 ́AtB[h̒l͈̔͂𐧖񂷂镪
  ߂邱ƂłBDigital  MAX ɂxNgŏő喽߂́A
  n[hEFAłT|[gĂ悤ŁAtB[h̒l͈͂
  JbgāAtB[hԂŌ̏グNȂ悤ɂĂ܂B

  AtB[h̒l͈̔͂Iɐ镪߂Ȃꍇ͂ǂ
  Ȃł傤c̏グŗׂ̃tB[hɉe^ĂȂƂ
  yɕۏ؂\͂̂ł傤H ͉̓Z̓𕪐͂
  邱Ƃɂ܂Bk rbg 2 ̐ZƁAʂ͑Ă k+1
  rbgłBāAk+1 rbg̃tB[hȂAʏ̖߂g
  ĂȂ܂܂B

  ܂ɂ 8 rbg̃tB[h 7 rbg 1 rbǵu
  ̏グp̗̈v̂ƂĂ݂܂傤B

  ______________________________________________________________________
                PE3          PE2          PE1          PE0
        +----+-------+----+-------+----+-------+----+-------+
  Reg0  | D' | D 6:0 | C' | C 6:0 | B' | B 6:0 | A' | A 6:0 |
        +----+-------+----+-------+----+-------+----+-------+
  ______________________________________________________________________

  7 rbg̃xNg̉Ẑ͎悤ɂȂ܂B܂OɁA
  Jグp̈ɓrbg(A'  B'AC'A D')ׂĂ 0 łƑz肵
  ܂BPɒʏ̉ZZsƂׂẴtB[h͐ 7 rbg
  ̒lɂȂ܂BAJグp̈̃rbgɂ́A1 Ƃl
  Ă̂oĂ邩܂BCɂ́A 1 񂾂
  ʏ̑s܂B͌Jグp̈̃rbgɃ}XN邱
  łB7 rbg̐̃xNgZ x+y ͂̂悤ɂȂ܂B

  ______________________________________________________________________
  ((x + y) & 0x7f7f7f7f)
  ______________________________________________________________________

  ŁA4 ̉Z傤 2 ̖߂ōς݁A͂Ƒxサ
  ܂B

  sǎ҂̕ȂAJグp̈̃rbg 0 ɂƌZZ܂
  ȂƂɋCÂꂽƎv܂B͂ƂĂȒPɏCł܂B
  x-y vZɂ́AԂ x ̌Jグp̈̃rbgׂ 1 
  y ׂ 0 ł邱Ƃۏ؂΂̂łBň̏ꍇł̂悤
  ɂΗǂ͂łB

  ______________________________________________________________________
  (((x | 0x80808080) - y) & 0x7f7f7f7f)
  ______________________________________________________________________

  Aǉrbg_aŹAŌ̑ł & 0x7f7f7f7f ̕
   x  | 0x80808080 ŒlôƂōœKł܂B

  ǂ̕@ SWAR ̕ƂĎgׂȂ̂ł傤H ͊ȒPŁA
  uԑx̂ȂǂłvłB[ƂɁAvO
  𓯂}VŎsĂAtB[h̃TCYقȂ΍œKȕ@ς
  邩܂B

  4.2.3.  lԂ̂Ƃƌ^ϊ

  vZ̒ɂ͉fɑ΂鉉ZȂǂ̂悤ɁAxNg i Ԗ
  ̒lIyh̃xNg i Ԗڂ̈ʒuɂlƂ֊֌Wɂ
  ꍇ܂AK̃P[XƂ͂܂BႦ΁AX[
  WÔ悤ȉf̑́Ảׂf̒lIyhƂĕKvƂ܂
  AFFT(fast Fourier transform t[Gϊ)̂悤ȕό`́A
  G(ǏIł͂Ȃ)ƂXɂ܂B
  ꎟ̗אڂl̂Ƃ𕪊ł͂ȂVtgŎ̂
  Ƃł͂܂BႦ΁APEi ̒l PE(i+1) Ɉړɂ́A
  PȃVtgŏ\łBtB[h 8 rbg̑傫ł΁A
  L̂悤ɂȂ܂B

  ______________________________________________________________________
  (x << 8)
  ______________________________________________________________________

  قǒPƂ͌܂BႦ΁APEi  PE(i-1) Ɉړ
  ɂ͒PȃVtgŏ\ł邩܂cAC ł̓Vtg
  삪rbg𐳂ێłĂ邩ǂmFł܂񂵁A}V
  ̒ɂ͕VtgsȂ̂܂B܂ʓI
  ́Arbg̃Rs[sāA 0 ɐݒ肵ĂKv
  B

  ______________________________________________________________________
  ((x >> 8) & 0x00ffffff)
  ______________________________________________________________________

  u܂ԂĂȂv@ƂƁAVtg𕪊ɂ
  Iɍs܂BႦ΂̕@g PEi  PE(i+1)Ɉړɂ́A
  L̂悤ɂ܂B

  ______________________________________________________________________
  ((x << 8) | ((x >> 24) & 0x000000ff))
  ______________________________________________________________________

  ɈʓIȃp^[̂Ȃ΂ȂȂƂȂƁA
  傫Ȃ܂BHP  MAX ł̖߃ZbgɌČƁACӂɃtB[
  hĔzu閽߂PƂő݂܂B̖߂ Permute ƌĂł
  ܂BPermute ߂Ƃt͕sK؂ŁACӂɕבւs
  ȂAJԂłĂ܂܂B܂AR x[y] Z\ɂȂ
  Ă܂B

  x[y] Ƃ́Â悤ȒPƖ߂Ȃł͎邱Ƃɍ
  łBR[hȂ邾łȂA܂Bۂɂ͏
  ɂȂĂ܂܂Bł͂ǂ悤܂B x[y] Z
  rIɍsVXeAMasPar  MP1/MP2  Thinking Machines
   CM1/CM2/CM200 Ƃ SIMD X[p[Rs[^ł邱Ƃ
  tĂ܂BÂ悤ȃX[p[Rs[^łĂAx[y]
  ׂ͗荇tB[hƂ̂ƂƔׂďɒxAł邾 x[y] 
  ZKvƂȂ悤ɃASY݌vꍇقƂǂłB܂
  n[hEFÃT|[gȂ΁A x[y] ͉ZƂĕsK؂ƌĂc
  ܂ȂƂɎł킯ł͂܂B

  JԂ(ҌAȂ) JԂ́AvZĂlԂɒI
  Ȋ֌W͂ƔF߂vẐƂw܂BAJԂ
  Ɍ삪ꍇ́A؍\̕ASYgāAvZL^
  ꍇ܂B

  łʓIȃ^Cv̕񉻂JԂɂ́AҌ(associative
  reduction)ƌ̂܂BႦ΃xNg̍vvZ
  ɁA C ̃R[hŒPɒƉL̂悤ɂȂ܂B

  ______________________________________________________________________
  t = 0;
  for (i=0; i<MAX; ++i) t += x[i];
  ______________________________________________________________________

  AZ̏ӖƂ͂܂łB_OaZ
  ́AZ̏ႤƌʂςĂ܂܂Aʏ̃bvEh
  Ȑ̉Z͏ɂČʂɉeł܂BāAɎs
  `؍\ŕɍvoR[hɏ܂B
  ƁA܂ŏɑ΂ƂȂlZAꂪvl̈ꕔƂȂcƂ
  JԂāAŏII 1 ̍vlɂȂ܂ŌvZ܂B8 rbg̒l
   4 ō\xNgȂ΁A傤 2 ̉ZKvƂȂ܂B
  ŏ 2  8 rbg̒lZāA16 rbg̃tB[h 2 Ɍ
  ܂ (tB[hꂼ 9 rbǧʂĂ܂)B

  y󒐁FOaZƂ́A炩߉Zʂ͈̔͂߂ĂA͈̔͂
  zZʂɂȂꍇɂ炩ߗpӂʂɒu鏈
  z

  ______________________________________________________________________
  t = ((x & 0x00ff00ff) + ((x >> 8) & 0x00ff00ff));
  ______________________________________________________________________

  ̎ɁA16 rbg̃tB[hɓĂ 9 rbg̒l 2 Z
  āA 10 rbǧʂ 1 邱ƂɂȂ܂B

  ______________________________________________________________________
  ((t + (t >> 16)) & 0x000003ff)
  ______________________________________________________________________

  ۂł́A16 rbg̃tB[h 2 ZƂɂȂ܂cA
  擪 16 rbg̉Z͈Ӗ܂BƂ̂́Aʂ 1  10
  rbg̒lƂă}XNĂ܂łB

  ́u񉻂PZvƂĂ΂ĂāAIɎ̂͂
  Ԃ񍢓łBҌƂ͈قȂǍʂ邩łB̂悤
  ȖŁA͂ƘAƂĎł܂B

  4.3.  Linux ɂ MMX g SWAR

  Linux ɂƂ IA32 vZbT͈Ԃ̊֐SłBAMD  CyrixA intel
  ׂĂ MMX ߂Ă̂͑f炵ƂłBAMMX
  ̃ptH[}Xɂ͂΂܂BႦ΁AK6  MMX ̃pCvC
   1 ĂȂ̂ɑ΂āAMMX Pentium  2 Ă܂B
   intel ܂ɂւĂȃR}[VĂ̂ɂ͂
  肵Ă܂c ;-)

  y󒐁F2001.3  Intel  AMD ̍\fXNgbv PC pv
  ZbTł PentiumIII  Athlon ͐Z̍ł MMX g
  Aꂼ SSE(internet streaming SIMD extensions)AEnhanced 3DNow!
  A_Z̍͂܂B_ZɊւ
   Pentium III ̕ Athlon 荂ƌĂ܂A_
  SIMD ߂ɂĂ Athlon ̕ƌĂ܂B傫ȗR
  ́ASSE  64 rbg̉Zu 128 rbg̃Iyĥ
  2 TCN̂ɑ΂AEnhanced 3DNow!  64 rbg̉Zu 64
  rbg̃Iyĥ 1 TCNōςނ߂łz
  SWAR  MMX p@ 3 ܂B

  1. MMX Cũ[`gB intel ́uptH[}XEC
     uv <http://developer.intel.com/software/products/perflib/> 
     ̂JĂāA}`fBASʂΏۂɎ
     ƂōœKlXȃ[`񋟂ĂB̓w͂΁A
     ̃Cũ[`̂gāA}`fBAp
     ASYvZS̕𒆐SɏB̃Cu
     ͌ Linux ł͗płȂAڐA\ł

  2. MMX ߂𒼐ڎgB 2 ̗R瑽GɂȂB܂AMMX
     vZbTŗpłȂȂƁBȂƑ̎i
     Ȃ΂ȂȂB̖́ALinux ŎgĂ IA32 ̃AZ
     uł MMX ߂FȂƂł

  3. ͓K؂ MMX ߂𒼐ڐłRpC̃
     W[gpB󂻂̂悤ȃc[͊Jł邪A܂
     Linux łׂ͂Ă̋@\ĂȂBႦΉX̓p[fw (
     <http://dynamo.ecn.purdue.edu/~hankd/SWAR/>)ɂČ݃RpC
     JłB͕񉻂{Ă鏭XȂ̂ C ŏ
     AC ̊֐ƂČĂяo SWAR W[𐶐ł\ł
     AMMX ͂߂Ƃ SWAR ̋@\T|[ĝȂ牽łp
     łBŏ̃vg^Cvł郂W[ERpC 1996 NH
     ɍ쐬ꂽAڎwĂiKɓBɂ͂܂܂Ԃ
     

     y󒐁F2001.3 ݁ALinux p MMX  3DNow!ASSE ̃Cuy
     RpC֘ÁAThe SWAR Homepage at Purdue University
     <http://shay.ecn.purdue.edu/~swar/> ɂ܂z

  v񂷂ƁAMMX g SWAR ͂܂gɂȂ܂Bw
  ΏL 2 Ԗڂ̕@݂͌łpł܂Bvȃ|Cg
  B

  1. vZbT MMX T|[gĂȂ MMX ͎gȂBL
     GCC ̃R[h MMX vZbTT|[gĂ邩𔻒肷B 0
     ԂΖT|[gA0 ȊOȂT|[gĂ

     ___________________________________________________________________
     inline extern
     int mmx_init(void)
     {
             int mmx_available;

             __asm__ __volatile__ (
                     /* Get CPU version information */
                     "movl $1, %%eax\n\t"
                     "cpuid\n\t"
                     "andl $0x800000, %%edx\n\t"
                     "movl %%edx, %0"
                     : "=q" (mmx_available)
                     : /* no input */
             );
             return mmx_available;
     }
     ___________________________________________________________________

  2. MMX WX^͊{Iɂ GCC  unsigned long long Ăяoꍇ
     ɂێB܂胁x[X̂̌^̕ϐ́A MMX W[
     ƂĂяo C vOԂ̂Ƃ̎iƂȂB̈
     ŁAMMX f[^ 64 rbgɃACf[^\ƂĐ錾ł
     (unsigned long long ̑傫 union ƂČ^錾邱ƂŁA
     ȒP 64 rbgɃACĂ邱Ƃۏ؂ł)

  3. MMX p\ȂAAZu߂ .byte g MMX R[h
     A߂GR[hłB͎Ƃł͍܂邪ARpC
     ŃR[h𐶐͓̂ȂBႦ΁AMMX ߂ PADDB
     MM0,MM1  GCC ̃CCEAZũR[hŉL̂悤ɃG
     R[hł

     ___________________________________________________________________
     __asm__ __volatile__ (".byte 0x0f, 0xfc, 0xc1\n\t");
     ___________________________________________________________________

  MMX _ẐƓn[hEFÂ镔gpĂ
  ƂYȂ悤ɁBMMX ĂR[h́A_ZĂ
  oĂ͂ȂB܂A_̃X^bŃAMMX R[hsO
  ɂ͋ɂĂKvBʏA_̃X^bN C ̊֐̐
  ŕ_gĂȂȂɂȂĂ

  4. MMX R[h甲oɂ́AEMMS ߂sBGR[hƉ
     L̂悤ɂȂ

     ___________________________________________________________________
     __asm__ __volatile__ (".byte 0x0f, 0x77\n\t");
     ___________________________________________________________________

  L܂ɈÂ炭AĂȂƊȂA͂̒ʂ
  ł傤B MMX ͂܂ł΂Łc̃hLg̏̔
  ł́AƗDꂽ MMX ɂ SWAR vO񎦂łƎv
  B

  5.  Linux ɓڂĂtvZbT

  ̕@͍ŋߒڂ𗁂тȂȂĂĂ܂AvZ@\t
  Linux VXegƁA̕񏈗ł͓s\ȒႢRXgƍ
  ptH[}X Linux Ŏł܂B͗pł\tgEFA
  قƂǂȂƂŁAłȂ̂ƂsKv܂B

  5.1.  DꂽzXgA Linux PC

  ʓIɕt`œڂĂvZbT́A̋@\𓮍삳
  邱ƂɓĂ܂B

  őȂƂƂƂɂ肷OɁA܂Ă
  đȂƂ܂BLinux PC ɓ̃VXe̗p͓̂
  Ƃ܂񂪁ALinux PC ̗͂̎p̂ɌĂ
  ȂvbgtH[ 1 łAƂƂłB

  PC zXgƂėDĂ闝ŔA 2 ܂B܂AŊȒP
  Ɋgł邱ƂłBfBXNAlbg[N̎͋JȂ
   PC ֒ǉł܂BꂩAC^tF[XeՂɎ_
  ܂BISA  PCI J[hLpł邾łȂAp|[g
  悤Ɏ荠ȃptH[}XC^tF[Xg邱ƂȂpł
  BIA32 ͓o͋Ԃ𕪊Ă̂ŁAn[hEFA̓o̓AhX
  ̕یX̓o̓|[g̃AhX̃xɍ킹邱ƂŁAC^
  tF[XȒPɎ邱Ƃł܂B
  Linux ͗DꂽzXg OS ł܂Bt[ɗpł\[XR[h
  ́unbLOvKChƖɗ܂BLinux ́AقڃA^
  Cɋ߂XPW[Oł܂A^ɃA^Cɓo[W
  Ƃ  <http://www.rtlinux.org/> ܂B񂻂dv
  Ȃ̂́A UNIX 񋟂ƂƂłBLinux  Microsoft
   DOS  Windows œ삷悤ɏꂽJp̃c[T|[g
  ܂BMSDOS ̃vO dosemu gāALinux ̃vZXƂāA
  ی삳ꂽz}Vŕʂ MSDOS s܂B Windows 3.xx 
  ΂ Linux̃T|[ǵA萸IŁA wine(
  <http://wine.dataparty.no/>)̂悤ȃt[\tgł́AقƂǂ̃vO
   UNIX  X łȂ萳Iɓ܂B

  L 2 ̃ZNVł́A Linux ŃT|[gtVXe
  ̗čs܂B

  5.2.  DSP Ă݂܂H

  \ DSP(Digital Signal Processing)vZbT̎s͐łB
  ʂ̃`bṽ͓AvP[VΏۂƂg݃VXep
  ݌vĂ܂Af炵tRs[^ł܂Bǂ
  Ăł傤H

  o  Texas Instruments( <http://www.ti.com/>) TMS320  Analog
     Devices( <http://www.analog.com/>) SHARC DSP t@~[̂悤ȑ
     ̃`bv́AuO[vWbN͂ق̂킸Ȑŕ
     }V\zł悤ɐ݌vĂ

     y󒐁FO[EWbN(glue logic)Ƃ́A\iԂ̃C^tF[
     XƂȂėҊԂ𒇗_HvgRӖ܂z

  o  łȂA1  100 ߁A 100 _Z
     ̐\B{߃WbÑRXgĂADSP vZbT
     1/10 ̃RXg PC p̃vZbTɕCGptH[}Xo
     mĂ

  o  dCȂMȂB܂Ã`bv܂Ƃߎg
     Ă܂ŎgĂ PC ̓dŏ\ŁAPC P[X̒Ɋi[Ă
     PC I[u̒̂悤ɂ͂ȂȂ

  o  DSP ߃ZbĝقƂǂ́Ap̃RpC(Ⴆ΁AC p)
     ł͉߂ɂg₷Ƃ͌BႦ΁Aurbg]Ah
     bVOvɓBtVXegƁA啔̃zXg
     pR[hfɃRpCĎsA͏ȂłԂHA
     SYTdɐlԂR[h`[ DSP Ŏs

  o   DSP vZbT́Aۂ UNIX ̂悤 OS ɐ݌vĂ
     킯ł͂ȂAvZbTƂĒPƂɔėpIȃRs[^Ƃ͌
     BႦ΁AǗ̂߂̃n[hEFAȂ̂
     B_ςƁADSP vZbT͂ėpIȃ}Vɓڂ
     ͂𔭊łBLinux PC  1 ł

  I[fBIJ[h⃂f̒ɂ́ALinux ̃hCoŃANZXł DSP
  vZbT𓋍ڂĂ̂܂A4 ȏ DSP v
  ZbTڂtVXeŌʂ傫܂܂B

  Texas Instruments  TMS320 V[Y (
  <http://dspvillage.ti.com/docs/dspproducthome.html>)͒ԂɓnĐl
  CAȒP TMS320 x[XŕVXe\złAȂ葽̃V
  Xełɑ݂Ă܂B TMS320 ɂ́AZp̂̂ƕ
  _Z\ȃo[W܂BÂ݌v̂̂́AςP
  x_tH[}bg̗pĂ܂AVf IEEE
  tH[}bgT|[gĂ܂B TMS320C4x(ʖ 'C4x)́ATI Ǝ
  Px_tH[}bggāA 80 MFLOPS B܂B
   'C67x ́APx_Z 1 GFLOPS BAIEEE ̕
  _g{xvZł́A420 MFLOPAS B܂Bɂ
  VelociTI Ƃ VLIW x[X̃`bvEA[LeN`gĂ܂B
  ̃`bv}`vZbTƂč\̂͗eՂł邾łȂA
  PƂ̃`bvł 'C8x }`vZbT́A IEEE ̕_ 100
  MFLOPS ܂B̃vZbT́A2  4 ̐Zp̎q
  DSP ƂȂ RISC vZbTłB

  y󒐁FVLIW(Very Long Instruction Word )́ARpCɂ
  Ĉˑ֌ŴȂ̖(Z╂_ZAANZX)
   1 ̒߂ƂāAɎs@łBvZbT̍\
  PɂȂ锽ʁARpCGɂȂ܂B VLIW  v
  ZbTł Transmeta  Crusoe ̂悤ɁARpC邱ƂȂ
  VLIW 悭Ƃ@oĂĂ܂BڂCrusoe
  Technology <http://www.transmeta.com/crusoe/technology.html> QƂ
  Ăz

  ̑ DSP vZbTt@~[ŁAŋ߂Ȃ̊ŕtVXe
  ɗpĂĂ̂ SHARC(ʖAADSP-2106x)Ƃ Analog
  Devices ( <http://www.analog.com/>)oĂ̂܂B
  ̃`bv́A6 ̃vZbTŋL𗘗p}`vZbTŁA
  O[EWbNKvƂ܂BK͂ȃVXe\złA
  ̏ꍇ́A6  4 rbg̃Nƃ`bv𗘗p܂BK͂ȃVX
  ȇ啔́ARp̃AvP[V^[QbgɂĂ悤ŁA
  XɂȂĂ܂BAIntegrated Computing Engines, Inc.(
  <http://www.iced.com/>)́AGreenICE Ƃ PCI J[h 2 Zb
  gɂ낢ioĂ܂B̃jbǵA16  SHARC v
  ZbTACɔzuĂAIEEE tH[}bg̒PxvZs[
  N\Ŗ 1.9 GFLOPS o܂B GreenICE ́A5,000 hȉ̃RXg
  B

  łAt DSP ́A Linux 񏈗̃R~jeB璍
  ڂ𗁂тĂƎvĂ܂cB

  5.3.  FPGA  č\\Ș_vZH

  񏈗Ђ瑬߂ȂAJX^En[hEFAł͂Ȃ
  Ȃ̂ł傤H łˁAɑ΂񓚂́A܂ɂRXg
  ƁAĴɎԂ߂邱ƁA܂ƏłASY
  ύXɂȂƖɗȂȂĂ܂Ɠ܂B
  NAdCIɍăvO~O\ FPGA(Field Programmable Gate Array)
  ̐iɂāǍ_̑啔ӖɂȂĂĂ܂B
  ̓Q[gxȂĂāA1  FPGA ŒP@\̃vZbT\
  ɍ쐬\łBFPGA ̍Đݒ(ăvO~O)~ႭȂĂ
  ĂAASYiK玟̒iKֈڍs悤ȏꍇłA
  ȂĐݒł܂B

  ͍Cl̕@łBFPGA ݒ肷̂ɂ́AVHDL ̂悤
  n[hEFALqg킴𓾂܂BƓl Linux zXgV
  XeŁAFPGA Ƃ̃C^tF[X̂߂ɒ჌xȃR[hKv
  ܂B FPGA ̃RXg͒ႭAɐxႭĂ܂Ȃ
  f[^̉ZɓKĂ܂(ہASWAR ̏K͂ȃTuZbgƂċ
  ǂ)B FPGA ́AGȉZf[^͂̂Ɠ炢̑xŎ
  sł܂BႦ΁AVv FPGA x[X̃VXełX[p[R
  s[^荂Ɉ`qf[^x[X̌łĂ܂B

  FPGA x[X̐pn[hEFA쐬ĂƂ͂낢날܂A
  f炵TvAL 2 ̊ƂoĂ܂B

  Virtual Computer Company  Xilinx  SRAM x[X FPGA gāA
  IɍĐݒ\ i낢oĂ܂B8 rbg 16 rbg
  uVirtual ISA Proto Boardv ( <http://www.vcc.com/prod1.html>)
  ́A2,000 hȉōwł܂B
  Altera  ARC-PCI(Altera Reconfigurable Computer, PCI bus) (
  <http://www.altera.com/cgi-bin/indexhtml.pl>) ́AVirtual ISA Proto
  Board Ɠ^CṽJ[hłAAltera  FPGA  ISA ł͂Ȃ PCI
  oXgĂ_قȂ܂B

  ݌vc[n[hEFALqARpCA[^[A}bṕA
  Windows  DOS ݂̂œ삷IuWFNgER[htĂꍇ
  قƂǂłBzXg PC  DOS  Windows ̃fBXNEp[eBV
  cĂāAKvɂȂ烊u[gƂg܂ALinux
   dosemu  wine ̂悤 Windows ̃G~[^g΁A
  \tgEFȂ삵܂B

  y󒐁F}bp(mapper)́AH FPGA ̘_ubNɕAFPGA 
  ł̉H铭܂z

  6.  ʓIȋƂ

  ̃ZNVňނ́ALinux ɂĕ񏈗s߂ 4 
  f܂B

  6.1.  vO~OƃRpC

  ̓RpC҂ƂĐԂɂ͖ʂĂ܂̂ŁALinux VXe
  ŎIɌIȕR[h𐶐f炵RpCɑ
  ƂƂbƎvĂ܂A͂ł͂܂BR[
  h̍쐬҂킴킴ʐM@wAGCC ŃRpC C 
  R[hŏꂽ̕񏈗@ł̃ptH[}X͂Ȃ
  Ȃł܂B

  Lɂ錾RpC̃vWFNǵAꂩIȃR[
  hȂɏ悤ɂ\IȂ̂̂łBʓIɁA
  ꂼꂪ^[QbgƂ^CṽvO~Oɑ΂Ă͌IȂ̂ł
  AłȂ GCC  C ̃vORpCKv܂
  ȂȂ悤ȌRpC݂͑܂c΂̂łB
  ̌RpCړIɉĂ΁AJZԂōς݁Afob
  O⃁eiXȒPɂȂƎv܂B

  (At@xbg)XgAbv̈ȊOɂARpC
  ͂񂠂܂Bt[ŎgRpC(Linux Ɋ֘AȂ̂
  قƂǂł)́A <http://www.idiom.com/free-compilers/> Ɉꗗ
  ܂B

  6.1.1.  Fortran 66/77/PCF/90/HPF/95

  ȂƂȊwvZł Fortran 嗬łB񌻍݂ Fortran
  ́A 1996 N ANSI Kî̂Ƃ͈Ⴂ܂BFortran 66 ͂Ȃȑf
  B Fortran 77 ͋@\ǉĂA̒ōłڂׂ@
  \ƂāALN^Ef[^̃T|[gADO [v\̕ύX
  B PCF(Parallel Computing Forum) Fortran ́A77 ɑ΂ĕ񏈗T
  |[g@\낢ƒǉ悤Ƃ܂BFortran 90 ͍̌
  ꂪĂ@\ĂāA77 ɑ΂ C++ ̂悤ȃIuWFNg
  wvO~O@\Ɣz̗vfɌvZ@\ǉĂ
  B HPF(High-Performance FortranA
  <http://www.crpc.rice.edu/HPFF/home.html>)́A2 ̃o[W(HPF-1
   HPF-2)oߒŁA{IɂgAWs肵
  ʁACM  Fortran  MasPar  Fortran  Fortran D Ƃ
  LgĂo[WɂȂ܂BHPF ̓f[^zu֌WɍL
  ėlXȕ񏈗̋͂ Fortran 90 ĝłBŏI
  Iɂ́AFortran 95  Fortran 90 𑽏Aǂ̂ƂĒ񋟂
  Ă܂B
  C ƘAWĂɂ́Af2c  g77(Linux ɓT
  <http://linux.uni-regensburg.de/psi_linux/gcc/ html_g77/g77_91.html>
  ɂ܂)܂AFortran 90  95 ̐i
  <http://extweb.nag.co.uk/nagware/NCNJNKNM.html> y󒐁FN؂z
  ܂B̃RpCׂĂ͌ǁAGCC obNGhɎgē
  R[hĂ܂B

  p Fortran ŁASMP pɕ񉻂R[hɑΉ̂ɂ́A
  <http://www.kai.com/>  <http://www.psrv.com/vast_parallel.html> 
  ܂B̃RpC SMP Linux œǂ͂͂肵܂
  񂪁A SMP Linux œ POSIX KĩXbh(Ȃ킿 LinuxThreads)
  łĂȂƎv܂B

  Portland Group( <http://www.pgroup.com/>)́Ap HPF Fortran (C 
  C++ )񉻂RpCASMP Linux p̃R[h𐶐
  Bʂ̃o[WƂāAMPI  PVM 𗘗pNX^^[Qbg
  i܂B < http://www.apri.com/> ŏoĂ FORGE 
  spfAxHPF ́ASMP  NX^ŖɗłB

  Lɂ̂́At[ɗpł Fortran ŁA Linux V
  Xeœ삷Ǝv܂B

  o  ADAPTOR(Automatic DAta Parallelism TranslaTORA
     <http://www.gmd.de/SCAI/lab/adaptor/adaptor_home.html>) ́AHPF 
     MPI  PVM ̖߂gāAFortran 77  90 ̃R[hɕϊ
     B Linux ɂĂ͐GĂȂ

  o  J[lM-Ew Fx( <http://www.cs.cmu.edu/~fx/>) ́A[
     NXe[Vőg񂾃NX^^[QbgɂĂ邪ALinux ɂ
     Ă͂킩Ȃ

  o  HPFC(prototype HPF Compiler(
     <http://www.cri.ensmp.fr/~coelho/hpfc.html>))́APVM Ăяo`
      Fortran 77 ̃R[h𐶐B Linux NX^Ɏĝ
     ͂ȂH

  o  Can PARADIGM(PARAllelizing compiler for DIstributed-memory General-
     purpose Multicomputers( <http://www.crhc.uiuc.edu/Paradigm/>))
     ́ALinux ŗpł邩킩Ȃ

  o  Polaris compiler(
     <http://ece.www.ecn.purdue.edu/~eigenman/polaris/>)́AL
     g}`vZbTVXep Fortran ̃R[h𐶐B
     ܂Ȃ PAPERS  Linux NX^ڂ邱ƂɂȂ

  o  PREPARE ( <http://www.irisa.fr/paris/pages-perso/Jean-Louis-
     Pazat/anglais/anterieures/Prepare.html>) ́AMPI ^[Qbgɂ
     邪c IA32 vZbTpɃR[h𐶐ł̂͂肵Ȃ

  o  ADAPT  ADLIBAshpf(Subset High Performance Fortran compilation
     systemA <http://www.ccg.ecs.soton.ac.uk/Projects/shpf/shpf.html>)
     ́ApubNhC MPI g Fortran 90 𐶐BLinux
     œ Fortran 90 ̃RpCĂȂc

  o  SUIF(Stanford University Intermediate Form(
     <http://suif.stanford.edu/>)) C  Fortran 񉻂RpC
     łB National Compiler Infrastructure vWFNg̒S
     ł̂Łc Linux Ƀ^[Qbg𓖂ĂĂlꂩȂ
     H

  ƗlXɑ݂ Fortran nɂāAɗ\RpC
  ̑ȂĂ܂ĂƎv܂A܂ɐĒǂ
  ̂łB̓ Linux œƂ킩ĂRpC
  ꗗɂƎvĂ܂BRg܂
  Applinux@ecn.purdue.edu ܂œdq[B
  6.1.2.  GLU (Granular Lucid)

  GLU(Granular Lucid)́AɍȃvO~OVXeŁAf[^
  t[^(Lucid)Ǝ葱^˔fłBPVM  TCP \Pbg
  T|[gĂ܂BLinux œ̂ł傤H ɏ񂪗~Ȃ
  <http://www.csl.sri.com/GLU.html>y󒐁FN؂zǂB

  6.1.3.  Jade  SAM

  Jade ͕vO~OŁAC gāAxe߃vO
  ɘAĎs܂BULfOɂĂ
  āASAM Ƃ PVM g[NXe[Vőg񂾃NX^ɂ
  Ă܂Bɏ񂪗~ꍇ́A
  <http://suif.stanford.edu/~scales/sam.html> ɂ܂B

  6.1.4.  Mentat  Legion

  Mentat ̓IuWFNgw̕񏈗VXeŁA[NXe[Vőg
  񂾃NX^œ܂BLinux ɂڐAĂ܂B Mentat ̃vO
  ~O(MPL)́AIuWFNgwvO~OŁAC++ x[X
  ɂĂ܂BMentat ̃^CEVXéAmubLOȃ
  [gEvV[WER[(RPC)ƂƂȂ̂gĂ܂B
  ɏڂ́A <http://www.cs.virginia.edu/~mentat/> ɂ
  B

  Legion( <http://www.cs.virginia.edu/~legion/>)́AMentat ɍ\z
  AWAN ɐڑĂ}VQ 1 ̉z}VƂĐU镑܂B

  6.1.5.  MPL(MasPar Programming Language)

  Mentat  MPL ƍȂ悤ɂĂBƂƂ̌
  ́AMasPar  SIMD X[p[Rs[^p̃lCeBu C n̂
  ɊJꂽ̂łBm̒ʂAMasPar ݂͌̋̕Ɩ
  sĂ܂ (݂́ANeoVista Solutions( <http://www.neovista.com>)
  ƂŁAf[^E}CjOƖsĂ܂)B MPL RpC
   GCC gč쐬Ă̂ŁAłt[ŗpł܂Bnc
  rɂAo}wƃp[fwōsƂ̒ŁAAFAPI(Z
  NV 3.6 QƂĂ)Ăяo C ̃R[h쐬
  ɁAMasPar  MPL ܂B Linux  SMPANX^
  Ƃ삵܂BRpCɂ͎኱oO܂c
  <http://www.math.luc.edu/~laufer/mspls/papers/cohen.ps> Ă
  B

  6.1.6.  PAMS(Parallel Application Management System)

  Myrias  PAMS(Parallel Application Management System)Ƃ\tgEF
  Ai̔ĂƂłBPAMS ͉zL񏈗ɑ΂Ĕ
  ɃVvȖߌQ񋟂Ă܂Blbg[N Linux }V
  ܂T|[gĂ܂Bڂ  <http://www.myrias.com/> Ă
  B

  6.1.7.  Parallaxis-III

  Parallaxis-III ́A\vO~OŁAModula-2 Ƀf[^̕
  (SIMD f 1 )邽߁AuvZbTƒʐM̉zv
  ܂BParallaxis ̃\tgEFAɂ́AA񏈗̃R
  s[^VXep̃RpCƃfobK(gdb  xgdb g)A
  摜͂߂ƂAlXȕ삩W߂cȃTvASY
  tĂ܂B Linux VXeł͓͒Ă܂cÂo[
  Wł́A낢ȕ񉻂ΏۂɂĂ܂AVo[W
  Ȃ\ł(Ⴆ΁APVM NX^^[QbgɂƂ)Bڂ
  ́A <http://www.informatik.uni-stuttgart.de/ipvr/bv/p3/p3.html> 
  pĂB

  6.1.8.  pC++/Sage++

  pC++/Sage++ ́AC++ ɂăf[^񉻂X^C̑uIu
  WFNg̎WvgāA{ƂȂuvNX̂痘p
  悤ɂ̂łBvvZbT PVM zœ삷 C++ R[h
  𐶐܂BLinux œ̂ǂ͂킩܂Bڍׂ́A
  <http://www.extreme.indiana.edu/sage/> ĂB

  6.1.9.  SR (Synchronizing Resources)

  SR(Synchronizing Resources)́ARJgEvO~OŁA
  \[XLvZXϐJvZĂ܂BƂāAv
  ZXԂ̑ݍpȂ݂񋟂Ă܂BSR ͑̎sƂ
  񋟂郁JjYVɓŒ񋟂Ă܂B̌ʁA
  ̋@\T|[g܂B̓[Jł̌ĂяoARPCAf
  u[AbZ[WʐMAIvZXA}`LXgAZ}tHłB

  y󒐁Ffu[(rendezvous)Ƃ́AقȂ^XN̓邽߂̎@
   1 ŁAAda ŎgĂ܂z

  Linux ɂڐA܂Aǂ̂悤ȕ񏈗sȂ̂͂肵
  ܂Bڍׂȏ́A <http://www.cs.arizona.edu/sr/www/index.html>
  ĂB

  6.1.10.  ZPL And IronMan

  ZPL ͔z񑀍{ƂvO~OŁAHwȊw̃Av
  P[ṼT|[gړIƂĂ܂BIronMan ƂȌȃbZ[W
  M̃C^tF[XĂяoƂŁÃC^tF[X\@\
  قƂǑ̃bZ[WʐMVXeƓ悤ȎgŊȒP
  ł܂B[NXe[Vőg񂾃NX^ł
  PVM  MPI ^[QbgƂĂāALinux T|[gĂ܂Bڍׂ
  ́A
  <http://www.cs.washington.edu/research/projects/orca3/zpl/www/> 
  B

  6.2.  ptH[}X̖

  ̕Xǂ̃}U[{[hlbg[NJ[hxXgȂ̂
  f悤ƁAx`}[Nɓꍞł܂B̉@ł́Ax`
  }[NvłԂɂȂ͂łɂ͗płxXgȂ̂
  ͌ȂȂĂ܂ĂAƂ肪܂BsŌȂ
  ȂĂA܂ǐiɒu肵Ă
  Ȃ̂łB

  PC n[hEFAŵ̓IWW[X𔃂̂Ɠ悤Ȃ
  łBʂ̓xɊƖ낤Ȃ낤AȂɂ̂
  Bi(͔ZkIWʏ`)ǂ̂̂mĂACɂ
  肷l͂قƂǂ܂B܂A{ɒӂ𕥂Ȃ΂Ȃ
  ̂́Aꕔ̃n[hEFÄႢȂ̂łBAhoCX͊ȒPłBLinux 
  n[hEFAɉ点̂c邱ƂłBcłA
  ł邾₩Ɏɓ@[ł鉿iAȕԕiɒ
  ĂB

  PC vZbTԂ̈ႢgŔĉɊiD̏ꏊ́A
  <http://www.pcguide.com/ref/cpu/fam/> łB WWW TCgS(
  <http://www.pcguide.com/>) PC n[hEFA̋Zp]łf炵
  Ƃł܂B̃n[hEFÃptH[}Xグ̂ɂ
  ĖɗƂ킸ł܂B܂ALinux Benchmarking
  HOWTO  <http://sunsite.unc.edu/LDP/HOWTO/Benchmarking-HOWTO.html> 
  n߂ɓǂނ̂ɂƎv܂B

  Intel IA32 vZbTɂ́AׂɃVXe̓쐫\v̂Ɏg
  pʂȃWX^܂BIntel  VTune (
  <http://www.intel.co.jp/jp/developer/vtune/index.htm>)́ÃWX^
  gāAƌ̃R[h`[jO}Vɂقǂ܂c
  cOȂ Linux ł͎g܂BPentium ̃ptH[}Xp̃WX^
  ɃANZX邽߂̃[_uEW[̃foCXEhCo⃉Cu
  E[`́A <http://www.cs.umd.edu/users/akinlar/driver.html>
  ɂ܂BӂȂ΂Ȃ̂́AIA32 vZbTłĂAp
  tH[}Xp̃WX^́Ał͂ȂƂƂłB̃R[h
  Pentium łA486  PentiumAPentium ProAPentium IIAK6 ł
  ܂B

  y󒐁F2001.3 ݁AVTune ́APentiumAPentium ProAPentium IIA
  Pentium IIIAPentium IV T|[gĂ܂BMMX  SSE ̃`[j
  O\łB{ł̔̔ɂẮAGNZ\tg
  <http://www.xlsoft.com/jp/products/vtune/perftool.htm> QƂĂ
  z

  K͂ȃNX^킸ȃXy[Xō\z悤ƂĂɑ΂ẮA
  ptH[}XłɕtĂƂ܂BȂƂ
  ߂̃vZbT̂́AxZT[Hgݍ܂ĂāA
  x܂ɍȂƓNbNx܂(M̔
  āAMコ)BCPU p̂Ƀy`FEfoCX (q[
  gE|v)wɂ͂߂܂񂪁Ał͕̓i̎
  Z邾łȂAVXeƂẴptH[}Xɂɉe^
  ƂɒӂĂBRs[^ݒuꍇɁAC̗
  悤ȒuMĂ܂ꏊɂ͒uȂ悤ɂĂ
  B

  ŌɂȂ܂AptH[}XƂ̓Xs[hł͂ȂMƉp
  ܂݂܂BM΁AƂiĂăVXe
  NbV܂Bʂɂ́A璷dzbgXbv\
  }U[{[ĥ悤ɓʂȂKvƂ܂B͈Ƃ͌܂
  BpƂ̂́AقڂȂ鎞łpłƂl
  BƂiăVXeNbVĂAVXe͂Ƃ
  ԂɏCău[g܂B̌ɂĊ{Iȗv̑_
   High-Availability HOWTO Ƃ܂BɃNX^
  ɂƂẮAp͂킸ȗ\ŎłȂ΂܂B
  ƂĂ͍Œ 1 ̗\ŁAł΃NX^ 16 ̃}V
  \ 1 Ƃ̂̂ł́AƎv܂Bꂽn[hEFÂĂ
  \ƌ΁Aێ_ɔׂĉpRXgႭł܂B

  6.3.  _\A܂傤

  Linux gĕ񏈗͒Nłł܂H I

  񏈗pX[p[Rs[^ƂčsĂ܂
  Ă܂̂AƂƂ݂ȂŐSzĂ̂́AȐ̂
  Ƃł͂܂B͏Ă܂ȂƎvĂ܂ (
  <http://dynamo.ecn.purdue.edu/~hankd/Opinions/pardead.html> Ă
  B{ɉN̂남܂Ƃ߂Ă݂܂)B
  ͂ƕ񏈗͐ԂĂ܂Bŋ߂ɂȂĕX[p[R
  s[^̐𒆎~ Intel łAMMX ⎟ IA64 EPIC
  (Explicitly Parallel Instruction Computer)ŁA̎Ă
  Ă܂B

  uLinuxvƁuparallelvCɓ̃T[`EGWŌĂ݂
  ΁AȂ肽̂Ƃ Linux g񏈗Ǝv
  ܂B Linux PC NX^͂ł͂߂Ă܂BLinux 
  Ă̂́APC ̃n[hEFAႢRXgō\˔
  ĂāA Linux g񏈗AK͂ŗ\Z̐񂪂O
  [vK͂Ŏȍ̌@ւ܂ōLg邱ƂɂȂ
  ̂łB

  ̃hLĝɋLڂĂlXȃvWFNǵA
  Ǝ悤ȕ񏈗̍\ƂĂúvTCg̈ꗗǗ
  Ă܂B  <http://yara.ecn.purdue.edu/~pplinux/Sites/> 
  ́AnCp[eLXg`Ŏʐ^AALڂhLg
  Ă܂BLinux VXe񏈗ɎgĂ邷ׂẴTCgΏ
  ƂĂ̂łBȂ̃TCg̏Ɍfڂɂ́A

  o  upĉ^płv Linux TCgĂ邱ƁBSMP łN
     X^g񂾃}Vł SWAR ȃVXełA͂܂tvZb
     TĂ}VłA[U Linux zŕvOs
     ł̂Ȃ炩܂ȂBLinux x[X̃\tgEFA(Ⴆ PVM
      MPIAAFAPI)̂悤ɁAڕ񏈗T|[gĂVXe
     ɃCXg[Ă邱ƁBn[hEFA Linux ŕ񏈗
     ɂ肫ɂȂĂKv͂ȂAvOĂȂ
     ɂ́A܂ʂ̖ړIŎgpĂĂ܂Ȃ

  o  Ȃ̃TCǧfڂ\邱ƁBTCg̏
     pplinux@ecn.purdue.edu ܂ő邱ƁBtH[}bgɂđ̍
     ڂɂL邱ƁBTCg^cĂ̂͂肵
     v]Ȃ͌fڂȂ

   14 ̃NX^fڂĂ܂BEK͂Ō΁AȂ
  \ Linux NX^邱Ƃ킩Ă܂Bfڂ
  ƂāA̕ۏ؂킯ł͂܂B Linux g
  Ɋ֘AƂLāAA͂@邱Ƃ]
  ł邾łB

  7.  {Ŏӎ

  |ɓ艺L JF o[̕XɃAhoCX󂯂܂B̏
  ؂Ă\グ܂B

  o  䂳

  o  삳

  o  R肳

