
å®çŸ©
䞊åããã°ã©ãã³ã°ã¯å°é£ã§ãã å
±æã¡ã¢ãªãåããã·ã¹ãã ã䜿çšããå Žåãå
±æãªãœãŒã¹ïŒã¡ã¢ãªïŒãžã®äžŠåããã»ã¹/ã¹ã¬ããã®ã¢ã¯ã»ã¹ã®åæã¯äžèŠã§ãã ãããè¡ãã«ã¯ã次ã䜿çšããŸãã
- ããã¯ïŒãã¥ãŒããã¯ã¹ïŒ;
- ããã¯ã®ãªãã¢ã«ãŽãªãºã ïŒããã¯ã¬ã¹ãããã¯ããªãŒïŒ;
- ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã
ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã¯ã競åããã¹ã¬ãããåæããããã®æè¡ã§ãã åœä»€ã°ã«ãŒããã¢ãããã¯ãã©ã³ã¶ã¯ã·ã§ã³ã«åé¢ããããšã«ãããåæããã°ã©ãã³ã°ãç°¡çŽ åããŸãã 競åããã¹ã¬ããã¯ãåãã¡ã¢ãªã®å€æŽãéå§ãããŸã§äžŠåã«å®è¡ãããŸã
1 ã ããšãã°ãããŒããèµ€é»ããªãŒã«è¿œå ããæäœïŒããããŒå
ã®ã¢ãã¡ãŒã·ã§ã³ïŒã¯ãè€æ°ã®ã¹ã¬ããã§äžŠè¡ããŠåäœã§ããŸãã
é衚瀺ã®ããã¹ã int move(list *from, list *to) { __transaction_atomic { node *n = pop(from); push(to, n); } }
ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã䜿çšããŠç«¶äºåã管çããã¢ãããŒãã¯æ¥œèŠ³çãšåŒã°ããŸããã¹ã¬ããã¯äºãã«ç¬ç«ããŠåäœãããŸãã«åãããŒã¿ãå€æŽãããšèããŠããŸãã ãã®å Žåãã»ãšãã©ã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯æ£åžžã«å®äºããŸãã 察ç
§çã«ãããã¯ããŒã¹ã®ã¢ãããŒãã¯æ²èŠ³çã§ããã¹ã¬ããã¯åžžã«ç«¶åããåæã«ã¹ã¬ãããã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã«å
¥ãããšãåžžã«çŠæ¢ãããšèããŠããŸãã
ããŒã¿ã®ç«¶åãçºçããå Žåããã©ã³ã¶ã¯ã·ã§ã³ã¯ãã£ã³ã»ã«ãããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ããã£ã³ã»ã«ãããšããã©ã³ã¶ã¯ã·ã§ã³äžã«ã¹ã¬ãããå®è¡ããã¢ã¯ã·ã§ã³ããã£ã³ã»ã«ãããŸãã ãã®åŸãéåžžã¯ãã©ã³ã¶ã¯ã·ã§ã³ãåéããããããç·æ¥åºå£ããšããŠäºåã«æå®ãããæ©èœãåŒã³åºãããŸããã»ãšãã©ã®å Žåãããã¯ã®äœ¿çšãžã®ããŒã«ããã¯ã§ãã
ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã®é·æïŒ
- æ¯èŒç䜿ããããïŒãã©ã³ã¶ã¯ã·ã§ã³ãããã¯å
ã®ã¡ãœããå
šäœã®çµè«ïŒ;
- ããã¯ãšãããããã¯ã®å®å
šãªæ¬ åŠ;
- 䞊è¡æ§ã®ã¬ãã«ããããã£ãŠçç£æ§ãåäžãããŸãã
ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã¯ç¹å¹è¬ã§ã¯ãããŸããã æ¬ ç¹ããããŸãïŒ
- äžé©åã«äœ¿çšãããšãããã©ãŒãã³ã¹ãäœäžãã誀åäœããå¯èœæ§ããããŸãã
- å¶éããã䜿çš-åãæ¶ããªãæäœã¯ãã©ã³ã¶ã¯ã·ã§ã³ã§å®è¡ã§ããŸããã
- ãããã°ã®è€éã-ãã©ã³ã¶ã¯ã·ã§ã³å
ã«ãã¬ãŒã¯ãã€ã³ããé
眮ããããšã¯äžå¯èœã§ãã
æè¡ã®èªç
ããŒã¿ããŒã¹ãã©ã³ã¶ã¯ã·ã§ã³ã¯æ°å幎åããååšããŠããŸãã ããŒã¿ããŒã¹ã®äžçãã䞊åããã°ã©ãã³ã°ã®äžçã«ãã©ã³ã¶ã¯ã·ã§ã³ã転éãããšããã¢ã€ãã¢ã¯ã1980幎代ã«åããŠçãŸããŸããã æè¡
ã¢ãŒãªã¹ã»ããŒãªãŒ ã
ã©ãŽã£ã»ã©ãžã¯ãŒã« ã
ãã«ã» ã·ã£ããã ãéçºãããæ®åããŸããã åæã®ç 究ã§ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã®ããŒããŠã§ã¢å®è£
ãææ¡ãããŸããããããã¯ããã«30幎éçãŸããããšã¯ãããŸããã§ããã
1990幎代ã«ããã®æè¡ã®æåã®ãœãããŠã§ã¢å®è£
ãç»å ŽããããŒããŠã§ã¢å®è£
ã¯2000幎代ã«åŒãæ»ãããŸããã
ãœãããŠã§ã¢ã®å®è£
ïŒãœãããŠã§ã¢ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªãSTMïŒ
ãœãããŠã§ã¢ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã®å€ãã®å®è£
ã®ãã¡ã4ã€ã匷調ããããšæããŸãã äŸã¯githubã§å
¥æã§ããŸãïŒ
JIghtuse / tm-experiments ã
ã¯ããŒãžã¥ã¢
Clojureã¯ãã³ã¢ããã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªããµããŒãããå¯äžã®èšèªã§ãã STMã®äž»ãªæ§æã¯ã
ref
ïŒãã©ã³ã¶ã¯ã·ã§ã³ã§ã®ã¿ããŒã¿ãå€æŽãããããŒã¿ãžã®åç
§ïŒãš
dosync
ïŒãã©ã³ã¶ã¯ã·ã§ã³ãããã¯ïŒã§ãã
Clojureã®STMãžã®ã¢ãããŒãã¯ãMultiVersion Concurrency ControlïŒ
MVCC ïŒãšåŒã°ããŸãããã©ã³ã¶ã¯ã·ã§ã³ã§äœ¿çšãããããŒã¿ã®è€æ°ã®è«çããŒãžã§ã³ãä¿åãããŸãã ãã©ã³ã¶ã¯ã·ã§ã³äžãã¹ããªãŒã ã¯éå§æã®ããŒã¿ã®ã¹ãããã·ã§ãããç£èŠããŸãã
é衚瀺ã®ããã¹ã
Clojureãã©ã³ã¶ã¯ã·ã§ã³ã®ãªã³ã¯ããŒãžã§ã³å³ã
ãã©ã³ã¶ã¯ã·ã§ã³1ãš2ã¯åæã«éå§ããã
ref v0
ããŒãžã§ã³ã®ã³ããŒã1ã€åãåããŸãã ãã©ã³ã¶ã¯ã·ã§ã³å
ã«ã¯ã
ref
ã®å€ãå€æŽããããŒã¿åŠçããããŸãã æåã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯ããæ©ãçµäºãã
ref
æ°ããå€ã§æŽæ°ãã競äºã«åã¡ãŸãã 次ã«ã2çªç®ã®ãã©ã³ã¶ã¯ã·ã§ã³ãçµäºãã
ref
ã®ããŒãžã§ã³ãäºæãããã®ã§ã¯ãªãã£ãããã
ref
ãæŽæ°ããããšããŠå€±æããŸãïŒå³ã®èµ€ãç¢å°ïŒã ãã®å Žåããã©ã³ã¶ã¯ã·ã§ã³ã¯åéããã
ref
æ°ããããŒãžã§ã³ã®ã³ããŒãåãåããŸãã
ref
ãå€æŽããããšãããã©ã³ã¶ã¯ã·ã§ã³ã¯ä»ã«ãªãããã2åç®ã¯ãã©ã³ã¶ã¯ã·ã§ã³2ãæ£åžžã«å®äºããŸãã
ãã©ã³ã¶ã¯ã·ã§ã³3ã®èšç®ã¯
ref
ã®å€ãå€æŽããªããããåèµ·åã¯åŒã³åºããããæ£åžžã«å®äºããŸãã
éè¡å£åº§éã®è³é移åã®äŸãèããŠã¿ãŸãããã
é衚瀺ã®ããã¹ãããã°ã©ã ã¯åäžã®ã¹ã¬ããã§å®è¡ãããŸãããã¹ã¬ããã»ãŒãã§ãã
(def account1 (ref 100)) (def account2 (ref 0)) ; 'ref' (deref refname): (deref account1) 100 ; @refname - (deref refname) @account2 0 (defn transfer [amount from to] (dosync (alter from - amount) (alter to + amount))) (transfer 100 account1 account2) 100
è¿œå ã®ããã©ãŒãã³ã¹ãéæããããã«ç°å¢ããç·©åãã§ãã競äºåã䜿çšãããªãã·ã§ã³ããããŸãã ããšãã°ããã®æ¥ã®ãã©ã³ã¶ã¯ã·ã§ã³ãã°ãä¿æããŠãããšããŸãã æçµæ®é«ãæ£ããããšãããã£ãŠããå Žåããã°å
ã®ãã©ã³ã¶ã¯ã·ã§ã³ã®é åºã¯éèŠã§ã¯ãããŸããã 100ãã«ãš50ãã«ã®2åã®åå²æããåãåãå Žåããžã£ãŒãã«ã«è¡šç€ºãããé çªã¯é¢ä¿ãããŸããã 2ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ããã®è²¢ç®ã¯äº€æå¯èœã§ãããclojureã¯ãŸãã«ãã®ãããªå Žåã«ç«¶äºåã®ãã
commute
æäœãæäŸããŸãã
é衚瀺ã®ããã¹ã (defn log-deposit [account amount] (dosync (println "Depositing $" amount " into account, balance now: " (commute account + amount)))) (def myaccount (ref 0)) (log-deposit myaccount 100) (log-deposit myaccount 50)
ãã¹ã±ã«
Haskellã®ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã¯ãHaskellãã©ãããã©ãŒã ã®äžéšã§ããSTMã©ã€ãã©ãªã«å«ãŸããŠããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ã¿ã€ãã®äžé©åãªäœ¿çšã¯ãããã°ã©ã ã®ã³ã³ãã€ã«ã®æ®µéã§å€æãããŸãã
Haskellã«ã¯åŒ·åãªåã·ã¹ãã ããããŸãã ãã®èšèªã¯ãæ©èœãå¯äœçšãšçŽç²ãªæ©èœã§åé¢ããŸãã ã¿ã€ã
IO t
å€ã¯ã¢ã¯ã·ã§ã³ãšåŒã°ããŸãã Haskellã§ã¢ãããã¯ã«ã¢ã¯ã·ã§ã³ãå®è¡ããã«ã¯ãã¢ã¯ã·ã§ã³ã®åã«ã¢ãããã¯ã«åèªãä»ããŸãã ã¢ã¯ã·ã§ã³ãåŒæ°ãšããŠã¢ãããã¯ã«åŒã³åºããšã2ã€ã®ä¿èšŒãåŸãããŸãã
- ååæ§-
atomically act
ããå¹æã¯ãä»ã®ãããŒããããã«ããããŠå
šäœãšããŠèŠããããã«ãªããŸãã ä»ã®ã¹ããªãŒã ã¯ã¢ãããã¯ã¢ã¯ã·ã§ã³å
ã®ç¶æ
ãèŠãããšãã§ãããæçµç¶æ
ã®ã¿ãèŠãããšãã§ããŸãã - åé¢-
atomically act
åŒã³åºãäžatomically act
ã¢ã¯ã·ã§ã³ã¯ä»ã®ã¹ã¬ããããå®å
šã«ç¬ç«ããŠå®è¡ãããŸãã èµ·åæã«äžçã®ç¶æ
ãåé€ãããã®ç¶æ
ã§å®è¡ããŸãã
atomically
ã®ã¿ã€ãã¯
atomically :: STM a -> IO a
ã§ãã ã¿ã€ã
STM a
ã®ã¢ã¯ã·ã§ã³ã¯åŒæ°ã§ãã
IO
ã¢ã¯ã·ã§ã³ãšåæ§ã«ã
STM
ã¢ã¯ã·ã§ã³ã«ã¯å¯äœçšããããŸããããã®ç¯å²ã¯ã¯ããã«çããªããŸãã åºæ¬çã«ã
STM
ã¢ã¯ã·ã§ã³ã¯ãã©ã³ã¶ã¯ã·ã§ã³å€æ°
TVar a
æžã蟌ã¿ãŸãã¯èªã¿åããè¡ããŸãã
readTVar :: TVar a -> STM a
writeTVar :: TVar a -> a -> STM ()
éè¡å£åº§éã§è³éã移åããäŸãèããŠã¿ãŸãããã
é衚瀺ã®ããã¹ã import System.IO import Control.Concurrent.STM
ã¹ã«ã©
Scalaã®STMå®è£
ïŒScalaSTMïŒã¯ãHaskellãšClojureã®å®è£
ã«è§ŠçºãããŸããã Scalaã«å ããŠãScalaSTMã¯JavaãšClojureããåŒã³åºãããŸãã ãã®å®è£
ã¯ãäžè¬çãªAkkaãã¬ãŒã ã¯ãŒã¯ã§äžŠåããã°ã©ã ãäœæããããã«äœ¿çšãããŸãã
ScalaSTMã¯ããã©ã³ã¶ã¯ã·ã§ã³å
ã§æä»çã«å€æŽããã
Ref
ã»ã«ãæäŸããŸãã äžå€ãªããžã§ã¯ããš
Ref
åºã¥ãããŒã¿æ§é ã¯ãå€ãã®ã¹ã¬ããã§äœ¿çšãããŸãã
ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã䜿çšããŠãäºéã«ãªã³ã¯ãããã¹ã¬ããã»ãŒããªã¹ããå®è£
ããããšãæ€èšããŠãã ããã æ®å¿µãªãããç§ã¯Scalaã§äŸãåéããããšãã§ããŸããã§ããããã®ã¬ãã¹ã³ã¯èªè
ã«ä»»ããŸãã
é衚瀺ã®ããã¹ãgithubã®å®å
šãªäŸïŒ
github.com/nbronson/scala-stm/blob/master/src/test/scala/scala/concurrent/stm/examples/ConcurrentIntList.scalaå
±ææ§é ãå®è£
ããããã«ã次ããã³åã®ããŒããžã®ãã€ã³ã¿ãŒã¯ã¹ã¬ããã»ãŒãã«ãªããŸãã ããã¹ã¬ãããä»ã®ã¹ã¬ãããå€æ°ã«ã¢ã¯ã»ã¹ããã®ãšåæã«ïŒèªã¿åããŸãã¯æžã蟌ã¿ïŒå€æ°ãæžã蟌ãå¯èœæ§ãããå Žåã¯ã
Ref
ã䜿çšããŸãã ãªã¹ãããŒãã®ã¯ã©ã¹ãå®çŸ©ãããªã¹ãã®ããããåæåããŸãã ãªã¹ãã¯å圢ã§ããäœææã«ãããããªã¹ããã€ã³ã¿ãŒããªã¹ããæããŸãã ãããã®ãã€ã³ã¿ãŒã
null
ããšã¯ãããŸããã
import scala.concurrent.stm._ class ConcurrentIntList { private class Node(val elem: Int, prev0: Node, next0: Node) { val isHeader = prev0 == null val prev = Ref(if (isHeader) this else prev0) val next = Ref(if (isHeader) this else next0) } private val header = new Node(-1, null, null)
x
ã
Ref
å Žåã
x()
ã¯
x
ã«æ ŒçŽãããŠããå€ãååŸãã
x() = v
ã¯
x() = v
ãšçããèšå®ããŸãã
Ref
ã¯ãã¢ãããã¯ãããã¯ïŒãã©ã³ã¶ã¯ã·ã§ã³ïŒå
ã§ã®ã¿èªã¿æžããããŸãã ããã¯ã³ã³ãã€ã«æã«ãã§ãã¯ãããŸãã 以äžã¯ããã©ã³ã¶ã¯ã·ã§ã³ã®äœ¿çšæ³ã瀺ããŠããŸãã
def addLast(elem: Int) { atomic { implicit txn => val p = header.prev() val newNode = new Node(elem, p, header) p.next() = newNode header.prev() = newNode } }
Scalaã¯ãå€ãã®ããã°ã©ãã³ã°ãã©ãã€ã ã®ã¢ã€ãã¢ããŸãšããŠããŸãã ãã©ã³ã¶ã¯ã·ã§ãã«ã¡ã¢ãªã®åéã§ãèšèªã«ç¬èªã®æè¡ãããããšã¯é©ãããšã§ã¯ãããŸããã åè¿°ã®Akkaãã¬ãŒã ã¯ãŒã¯ã¯ãã¢ã¯ã¿ãŒãšãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã®æ©èœãçµ±åããŠãæçµçã«ããªãã®å¿ãå¹ãé£ã°ã
ãšãŒãžã§ã³ããš
ãã©ã³ã¶ã¯ã·ã§ã³ ãšãŒãžã§ã³ããçæããŸãã
C / C ++ïŒGCC 4.7+ïŒ
ããŒãžã§ã³4.7以éãGCCã¯ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªããµããŒãããŠããŸãã å®è£
ã¯libitmã©ã³ã¿ã€ã ã©ã€ãã©ãªã§ãããã³ã³ãã€ã«ã«ã¯-fgnu-tmïŒ-mrtmã-mhleïŒãã©ã°ãæå®ãããŸãã ãã®ã©ã€ãã©ãªãŒã¯ãC ++ã®ãã©ã³ã¶ã¯ã·ã§ã³æ§é ã®
ãã©ããã«æ³šç®ããŠéçºãããŸããïŒæšæºãžã®èšèªã®çµã¿èŸŒã¿ãææ¡ãããŠããŸãïŒã
ã»ãšãã©ã®ããŒããŠã§ã¢ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã®å®è£
ã¯ãæ倧éã®åªåã®ååã䜿çšããŸãã ãããã£ãŠãå®çšçãªå®è£
ã§ã¯ãããŒããŠã§ã¢ãšãœãããŠã§ã¢ã®ãã©ã³ã¶ã¯ã·ã§ãã«ã¡ã¢ãªãã¯ãããžãŒãçµã¿åãããŠäœ¿çšââããŸãã ãã®ãããªã·ã¹ãã ã¯ããã€ããªãããã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã·ã¹ãã ãšåŒã°ããŸãã ãããã«ã¯ãç¹ã«GCCã®å®è£
ãå«ãŸããŸãã
ããŒã¯ãŒãã¯èšèªã«å
¥åãããŸãïŒ
__transaction_atomic { ⊠}
-ã³ãŒããããã¯ããã©ã³ã¶ã¯ã·ã§ã³ã§ããããšã瀺ããŸãã__transaction_relaxed { ⊠}
-ãããã¯å
ã®å®å
šã§ãªãã³ãŒããå¯äœçšã«ã€ãªãããªãããšã瀺ããŸãã__transaction_cancel
æ瀺çãªãã©ã³ã¶ã¯ã·ã§ã³ã®ãã£ã³ã»ã«ãattribute((transaction_safe))
-ãã©ã³ã¶ã¯ã·ã§ã³ã»ãŒãæ©èœã®è¡šç€ºãattribute((transaction_pure))
-å¯äœçšã®ãªãé¢æ°ã瀺ããŸãã
Cã§ã®ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã®äœ¿çšã瀺ãããã«ã競åã¹ã¬ããã®ããŒã¿ã®ãã¹ãã°ã©ã ãäœæããŸãã
é衚瀺ã®ããã¹ãgithubã§ã®å®å
šãªå®è£
ïŒ
github.com/JIghtuse/tm-experiments/blob/master/histogram/src/hist.cãã¹ãã°ã©ã æŽæ°ãµã€ã¯ã«ããšã«1ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ãããã¯ã䜿çšãããŸãã ã©ã³ã¿ã€ã ã©ã€ãã©ãªïŒãŸãã¯ããŒããŠã§ã¢ïŒã¯ããã€ã©ã®ãã©ã³ã¶ã¯ã·ã§ã³ãåèµ·åãããã決å®ããŸãã
#ifdef _USE_TSX __transaction_atomic { #endif for (i = 0; i < d->sz; ++i) { struct pixel p = d->pixels[i]; unsigned int luminance = rY * p.red + gY * p.green + bY * p.blue; #if defined _USE_TSX ++histogram[luminance/BORDER]; #elif defined _USE_MUTEX pthread_mutex_lock(&mut); ++histogram[luminance/BORDER]; pthread_mutex_unlock(&mut); #endif } #ifdef _USE_TSX } #endif
ããŒããŠã§ã¢å®è£
ïŒããŒããŠã§ã¢ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªãHTMïŒ
æè¿ã«ãªã£ãŠããããããã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã®ããŒããŠã§ã¢å®è£
ãç»å Žãå§ããŸããã
ãµã³ããã¯ïŒSPARC v9ïŒ2007-2008

Sun Microsystemsã®Rockãã€ã¯ãããã»ããµã¯ããã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªãããŒããŠã§ã¢ã§ãµããŒãããæåã®ãã€ã¯ãããã»ããµã§ãã 64ãããããã»ããµã¢ãŒããã¯ãã£SPARC v9ã«ã¯16ã³ã¢ããããŸããã
2007幎ãå瀟ã¯æè¡ãµããŒããçºè¡šããŸããã ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã®æäœã®ããã«ã2ã€ã®æ°ããåœä»€ã
chkpt
ãš
commit
ããã³1ã€ã®æ°ãã
cps
ã¹ããŒã¿ã¹ã¬ãžã¹ã¿ãè¿œå ãããŸããã
chkpt <fail_pc>
䜿çšããŠãã©ã³ã¶ã¯ã·ã§ã³ãéå§ãã
commit
ã¹ããŒãã¡ã³ãã䜿çšããŠãã©ã³ã¶ã¯ã·ã§ã³ãå®äºããŸããã ãã©ã³ã¶ã¯ã·ã§ã³ããã£ã³ã»ã«ããããšã
<fail_pc>
ãžã®ç§»è¡
<fail_pc>
ããŸããããã®æç¹ã§ã
cps
ã¬ãžã¹ã¿ããã§ãã¯ããŠãã£ã³ã»ã«ã®çç±ãå€æããããšãã§ããŸããã ããŒã¿ã®ç«¶åãTLBãã¹ãå²ã蟌ã¿ãè€éãªåœä»€ã«ããããã©ã³ã¶ã¯ã·ã§ã³ãäžæãããŸããã ãã ããå€ãã®å ŽåãRockããã»ããµã§ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã䜿çšãããšãåæã®å©ç¹ãåŸãããŸãã
2008幎ããµã³ã®ãšã³ãžãã¢ã¯ãTransactional Memory InterfaceãšAdaptive Transactional Memory Test Platformã·ãã¥ã¬ãŒã¿ãŒãå°å
¥ããŸããã Oracleã«ããSunã®è²·ååŸãRockãããžã§ã¯ãã¯ééãããŸãããããã®ããã»ããµã«ã¯2ã€ã®é©ãã¹ãç¹æ§ããããŸãããä¿¡ããããªãã»ã©é
ããèšå€§ãªãšãã«ã®ãŒãæ¶è²»ããŸããã ããã»ããµãéç±ããªãããã«ãäžéšã®12ã€ã³ãã®å·åŽãã¡ã³ãè£
çããå¿
èŠãããã»ã©æãã£ãã ãã®ãããžã§ã¯ããç¶ããã®ã¯å€¢äžã«ãªããŸããã
2IBM BlueGene / QïŒPowerPC A2ïŒ2011

BlueGene / Qã¢ãŒããã¯ãã£ãåããSequoiaã¹ãŒããŒã³ã³ãã¥ãŒã¿ãŒã¯ããã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªããŒããŠã§ã¢ããµããŒãããæåã®åçšã·ã¹ãã ã§ããã ãã®ãã¯ãããžãŒã¯ãPowerPC A2ããã»ããµãŒïŒPowerPC BQC 16CïŒã®ç¬¬2ã¬ãã«ã®32 MBãã£ãã·ã¥ã§åäœããŸãã ãã£ãã·ã¥å
ã®ããŒã¿ã«ã¯ãããŒãžã§ã³ããšããã©ãã«ãä»ããŠããããã£ãã·ã¥ã¯åãããŒã¿ã®è€æ°ã®ããŒãžã§ã³ãä¿åã§ããŸãã
ããã°ã©ã ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã®éå§ã«ã€ããŠããã»ããµã«éç¥ãããã®äœæ¥ãè¡ãããã©ã³ã¶ã¯ã·ã§ã³ãå®äºïŒã³ãããïŒããå¿
èŠãããããšãå ±åããŸãã ä»ã®ã¹ã¬ãããåãããŒã¿ãå€æŽããå ŽåïŒããŒãžã§ã³ãäœæããŠããå ŽåïŒããã£ãã·ã¥ã¯ãã©ã³ã¶ã¯ã·ã§ã³ãæåŠããã¹ã¬ããã¯ãããå床å®è¡ããããšããŸãã ä»ã®ããŒãžã§ã³ã®ããŒã¿ã衚瀺ãããªãå ŽåãããŒã¿ã¯å€æŽããããã©ã³ã¶ã¯ã·ã§ã³ã¯æ£åžžã«å®äºããŸãã
PowerPC A2ã®VersionPCãã¯ãããžãŒã¯ãææ©çå®è¡ã«ã䜿çšãããŸãã ããŒã¿ã®æ°ããããŒãžã§ã³ãåŸ
ã€ä»£ããã«ãã¹ããªãŒã ã¯å©çšå¯èœãªããŒã¿ã䜿çšããŠèšç®ãå®è¡ããææ©çã«æçšãªäœæ¥ãå®è¡ã§ããŸãã ããŒã¿ãæŽæ°åŸãšåãå Žåãã¹ããªãŒã ã¯ãã£ãã·ã¥ããã®äœæ¥ãå®äºïŒã³ãããïŒããŸãã ããã©ãŒãã³ã¹ãé«ããªããŸãïŒã¹ã¬ããã¯æçµå€ãŸã§äœæ¥ãè¡ããŸããã ããã§ãªãå Žåãææ©çäœæ¥ã®çµæã¯æåŠããããããŒã¯æ£ããå€ã§èšç®ãå®è¡ããŸãã
ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã®ãµããŒãã¯ãäœããã®æ¹æ³ã§PowerPCããã»ããµã«é·å¹ŽååšããŠããæ©èœã®è«ççãªæ¡åŒµæ©èœã§ãããããŒããªã³ã¯/ã¹ãã¢æ¡ä»¶ä»ãããŸãã¯LL / SCã§ãã LL / SCã¯ããã¹ãŠã®ã¹ããªãŒã ã»ãŒãæ§é ã®æ§ç¯ãããã¯ãšããŠäœ¿çšã§ããããªããã£ãæäœã§ãã LL / SCã®æåã®éšå-load-link-ã¯ãããã°ã©ã ãã¡ã¢ãªããããŒã¿ãååŸããããã«äœ¿çšããŸãã 次ã«ãã¹ããªãŒã ã¯ããŒã¿ãå€æŽããstore-conditionalã䜿çšããŠã¡ã¢ãªã«æžã蟌ã¿ãŸãã ããŒã¿ãå€æŽãããŠããªããã°ãã³ãã³ãã¯æåããŸãã ãã以å€ã®å Žåãããã°ã©ã ã¯ããŒã¿æäœãæåããç¹°ãè¿ããŸãã
ã¹ããã€ãã®ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã¯LL / SCã§ããã¹ã¬ããã¯å€ãã®ç°ãªãã¡ã¢ãªé åã§LLæäœãå®è¡ãããã©ã³ã¶ã¯ã·ã§ã³å®äºæäœã¯ãã¹ãŠã®ã¡ã¢ãªé åãã¢ãããã¯ã«å€æŽãããããã©ã³ã¶ã¯ã·ã§ã³ïŒSCãªã©ïŒããã£ã³ã»ã«ããŸãã
ããããããã®ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã«é¢ããIBMã®ç 究ã玹ä»ããRuud Haringã¯ãå瀟ãå®è£
ã«ãããŠå€ãã®éèŠãªèª²é¡ã«çŽé¢ããŠããããšãèªããŸããã ãã¹ãŠã®è€éãã«å¯ŸããŠãå®è£
ã«ã¯å¶éããããŸãããã©ã³ã¶ã¯ã·ã§ã³ã®ããã»ã¹éãµããŒããæäŸããŸããã ãã®åé¡ã¯ã»ã³ã€ã¢ã«ã¯é¢ä¿ãããŸããããåæã«ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã䜿çšããããšã§åŸãããå©çãèŠç©ããããšãã§ããŸãã
IBM zEnterprise EC12ïŒZ /ã¢ãŒããã¯ãã£ãŒïŒ2012
ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªåœä»€ããµããŒãããæåã®åçšãµãŒããŒã IBMã¯ããã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã䜿çšããŠãDB2ããŒã¿ããŒã¹ã§ä»®æ³ãµãŒããŒè² è·ã§å®è¡ãããŠããz196ãã·ã³ãããããã©ãŒãã³ã¹ã45ïŒ
åäžããããšãçºèŠããŸããã
IBM Power8ïŒPowerïŒ2013

Power 8ã¡ã¢ãªã³ã³ãããŒã©ãŒã¯ããã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªããµããŒãããŠããŸãã ã«ãŒãã«ããŒãžã§ã³3.9以éãLinuxã«ãŒãã«ã®ãã¯ãããžãŒã®ãµããŒããç»å ŽããŸããã
Power8ã®HTMã«é¢ããæ
å ±ã¯ããŸããããŸããã§ãããããŸã 衚瀺ãããããšãé¡ã£ãŠããŸããIntel HaswellïŒx86ïŒ2013

2012幎ãIntelã¯x86åœä»€ã»ããã«Transactional Syncrhonization ExtensionsïŒTSXïŒã®å°å
¥ãçºè¡šããŸããã æ¡åŒµæ©èœã«ãããããã°ã©ãã¯ã³ãŒãã®åã
ã®ã»ã¯ã·ã§ã³ããã©ã³ã¶ã¯ã·ã§ã³ãšããŠããŒã¯ã§ããŸãã
2013幎ãHaswellããã»ããµã®äžä»£ã®ãªãªãŒã¹ã«ããããã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã®ããŒããŠã§ã¢ãµããŒããæ¶è²»è
ã¬ãã«ã§æåã«å©çšå¯èœã«ãªããŸããã
Haswellã¯ãL1ããŒã¿ãã£ãã·ã¥ã¢ãã¬ã¹ã远跡ããããšã§ããã£ãã·ã¥ã©ã€ã³ã®ç²åºŠã§èªã¿åãã»ãããšæžã蟌ã¿ã»ããã管çããŸãã 競åã¯ããã£ãã·ã¥äžè²«æ§ãããã³ã«ã䜿çšããŠæ±ºå®ãããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ã®ç«¶åãå€æãããã£ãã·ã¥ã®äžè²«æ§ãç¶æããã¿ã¹ã¯ã¯éåžžã«è¿ããããããã¯ä»®å®ããã®ãè«ççã§ããããã¹ã¬ããã§å€ãå€æŽãããä»ã®ã¹ã¬ããã§ã¯å€æŽãããªãå Žåãäœããããããã
TSXã¯2ã€ã®éšåã§æ§æãããŠããŸãã Hardware Lock ElisionïŒHLEïŒã¯ãããã¯ããŒã¹ã®ããã°ã©ã ãããã©ã³ã¶ã¯ã·ã§ã³ããã°ã©ã ãžã®åçŽãªå€æãæäŸããçµæã®ããã°ã©ã ã¯æ¢åã®ããã»ããµãšã®äžäœäºææ§ããããŸãã å¶éä»ããã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªïŒRTMïŒã¯ããã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã®ããå®å
šãªå®è£
ã§ãã
ããŒããŠã§ã¢ããã¯ãšãªã·ãªã³
HLEã¯ãã¡ã¢ãªã®ã»ã¯ã·ã§ã³ãå€æŽããããã®åœä»€ããããã«å€æŽããŸãã ãã®ãã¯ãããžãŒã¯ããã¬ãã£ãã¯ã¹ãè¿œå ããŸã-ã¢ã¯ã·ã§ã³ãå®è¡ããªããã次ã®åœä»€ã®è§£éãå€æŽããåœä»€-ããã¯ãååŸããã³è§£æŸããããã®åœä»€ãå€æŽããŸãïŒããããXACQUIREããã³XRELEASEïŒã
ããã¯ãšããã¯è§£é€ã®éãããã»ããµã¯ã¹ããªãŒã ãèªã¿æžãããã¡ã¢ãªã远跡ããŸãã 競åãçºçããå Žå-2ã€ã®ã¹ã¬ããã1ã€ã®ããŒã¿ãå€æŽãããã1ã€ã®ã¹ã¬ãããä»ã®ã¹ã¬ãããæžã蟌ãããŒã¿ãèªã¿åããšãããã»ããµã¯ããã¯ã解é€ããããšãã©ã³ã¶ã¯ã·ã§ã³ããã£ã³ã»ã«ããŸãã ãã以å€ã®å Žåãå®è¡ã¯æ£åžžã«ç¶è¡ãããŸãã
ãããã£ãŠãHLEã§ã¯ãäžè¬çã«åãå
¥ããããŠããããã¯ããŒã¹ã®ã³ãŒãã楜芳çã«ããããšãã§ããŸãã åã¹ã¬ããã¯ããã¯ãåä¿¡ãããšèŠãªããŸãããä»ã®ã¹ã¬ããã¯åæã«åäœã§ããŸãã å®å
šã§ããéãããã©ã³ã¶ã¯ã·ã§ã³ã¯ãã£ã³ã»ã«ãããŸããã
ãã®ãã¯ãããžãŒã¯ãéHTMããã»ããµãŒãšäžäœäºææ§ããããŸãã ããã¯ç®¡çæäœã¯æ®ããŸãããç¹å¥ãªãã¬ãã£ãã¯ã¹ãä»ããŸãã Haswellããã»ããµã¯ãã¬ãã£ãã¯ã¹ãèæ
®ããããã¯æäœã®ä»£ããã«ãã©ã³ã¶ã¯ã·ã§ã³å®è¡ã䜿çšããŸãã ä»ã®ããã»ããµã¯ãã¬ãã£ãã¯ã¹ãç¡èŠããåŸæ¥ã®ããã¯ããŒã¹ã®åäœã䜿çšããŠããã¯ãå¶åŸ¡ããŸãã XACQUIREããã³XRELEASEåœä»€ã¯ãã§ã«ååšããŸãããç¹å®ã®åœä»€ã§äœ¿çšãããŸã§æå³ããããŸããã
HLEã䜿çšãããšãHaswellã§ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããããã°ã©ã ãšãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãèšè¿°ã§ãããããã¯ããããšãªãåæå®è¡æ§ãåäžããŸãã ã³ãŒãã¯çŸåšã®ããã»ããµã§æ£ããåäœããŸãã ãã®çµæãæ°ããæ©èœã®å°å
¥ã¯ç°¡åã§å®å
šã«ãªããŸãã
ç°¡åãªäŸã®HLEãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯ãéåžžãããã»ããµåºæã®æŽæ°åã䜿çšããŠãã¡ã¢ãªã®ã»ã¯ã·ã§ã³ãšããŠã«ãŒãã«ã«ããã¯ãå®è£
ããŸãã ããã¯ãååŸããã¹ã¬ããã¯ããã®ã¡ã¢ãªã§äœããè¡ããŸããããšãã°ãå€ã0ãã1ã«å¢ãããŸããããã¯ã解é€ããã«ã¯ãéã®æäœãé©çšããŸãïŒããšãã°ã1ãã0ã«ãã¯ãªã¡ã³ãããŸãïŒã å€æŽã¯åããã»ããµã³ã¢ãšã·ã¹ãã å
ã®åã¹ã¬ããã«èªèããããããä»ã®ã¹ã¬ããã¯ããã«ããã¯ãååŸã§ããªããšå€æããããã¯ã解æŸãããã®ãåŸ
ã€å¿
èŠããããŸãïŒå€0ãååŸïŒã
XACQUIRE / XRELEASEãã¬ãã£ãã¯ã¹ã䜿çšãããšãããã¯ãååŸããããšããè©Šã¿ã¯æåããããã»ã¹ã¯ããã¯ãããã«å±ãããšæ³å®ããåŒãç¶ãåäœããŸãã . , , 1, - 0. , . , .
HLE: 0 1 , 0. ââ .
å¶éããããã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãª
RTMã¯ããå€ãã®é¢äžãå¿
èŠãšããŸããåŸæ¹äºææ§ãåé¿ãã3ã€ã®æ°ããåœä»€ãå°å
¥ããŸããHLEã¯æé»çã«ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããããã¯ããŒã¹ã®ã³ãŒãã䞊è¡ããŠå®è¡ã§ããããã«ããŸãããRTMã¯ãã©ã³ã¶ã¯ã·ã§ã³ã®éå§ãçµäºãäžæãæ瀺çã«ããŸããã¹ã¬ããã¯XBEGINåœä»€ã§ãã©ã³ã¶ã¯ã·ã§ã³ãéå§ãããã©ã³ã¶ã¯ã·ã§ã³ãäžæãããå Žåã«èµ·åãããããã©ãŒã«ããã¯ãæ©èœãæäŸããŸãããã©ã³ã¶ã¯ã·ã§ã³ã¯XENDåœä»€ã§çµäºããããã»ããµã¯ç«¶åããªãå Žåã¯ãã©ã³ã¶ã¯ã·ã§ã³ãå®è¡ãããããã©ã³ã¶ã¯ã·ã§ã³ãäžæ¢ããã¹ãã¢æ©èœã«æž¡ããŸãããã©ã³ã¶ã¯ã·ã§ã³ã¯ãXABORTåœä»€ã«ãã£ãŠããã°ã©ã å
ã§æ瀺çã«äžæãããŸããå¢çã®æ瀺çãªäœ¿çšãšãéåºå£ãã®ãããã§ãRTMã§ã¯HLEãããå®å
šã«ãã©ã³ã¶ã¯ã·ã§ã³ãå¶åŸ¡ã§ããŸããé·æçã«ã¯ãRTMã¯ãã©ã³ã¶ã¯ã·ã§ã³æ©èœã®å®è£
ãç°¡çŽ åããŸããçµè«
ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã®äœ¿çšã¯ã䞊åããã°ã©ãã³ã°ãç°¡çŽ åããæ¢åã®åææè¡ã®å®è¡å¯èœãªä»£æ¿æ段ã§ãã翻蚳ãæäœãããã³ã¿ã€ããã¹ã®ééãã«ã€ããŠã¯ãå人çãªã¡ãã»ãŒãžãæžããŠãã ããã泚é
- ã競åæ§ããšã䞊åæ§ãã®æŠå¿µã®éãã¯ãããã»ãã€ã¯ã®æŒèª¬ã䞊è¡æ§ã¯äžŠåæ§ã§ã¯ãããŸãããã§æ£ããè¡šçŸãããŸããã
- ã¯ããåªãããœãããŠã§ã¢è£œåïŒOpenSolarisãMySQLãOpenOfficeïŒã®ãã³ãã«ã«å ããŠããªã©ã¯ã«ã¯ææãªããŒããŠã§ã¢æè¡ãæŸæ£ããŸãã
ãœãŒã¹