これ以䞊無料のスヌプはありたせん

プログラミングの䞊行性ぞの根本的なシフト



投皿者 王章のサッタヌ

翻蚳 アレクサンダヌ・カチャノフ



無料のランチは終わりたした゜フトりェアの䞊行性ぞの根本的な転換

ハヌブサッタヌによる



元の蚘事ぞのリンク www.gotw.ca/publications/concurrency-ddj.htm



翻蚳者泚 この蚘事では、プロセッサヌの開発における珟圚の傟向の抂芁ず、プログラマヌにずっおこれらの傟向が正確に意味するものを提䟛したす。 著者は、これらの傟向は基本的であり、珟代のすべおのプログラマヌが生掻に远い぀くために䜕かを再孊習する必芁があるず考えおいたす。



この蚘事はかなり叀いです。 2005幎初頭の最初の出版の瞬間から数えるず、圌女はすでに7歳です。 翻蚳を読むずきは、これを芚えおおいおください。すでに慣れ芪しんでいるものの倚くは、2005幎にこの蚘事の著者にずっお新しく登堎したばかりでした。





最倧の゜フトりェア開発革呜は、OOP革呜以来あなたのドアをノックしおいたす。その名前はParallelismです。





この蚘事は、雑誌「Dr. Dobb's Journal、2005幎3月。 この蚘事の短いバヌゞョンは、2005幎2月に「同時実行革呜」ずいうタむトルでC / C ++ Users Journalに掲茉されたした。



曎新プロセッサの成長傟向チャヌトは2009幎8月に曎新されたした。 新しいデヌタが远加され、この蚘事のすべおの予枬が実珟するこずを瀺しおいたす。 この蚘事の残りのテキストは、2004幎12月に公開されたため、倉曎されおいたせん。



無料のスヌプはすぐになくなりたす。 これに぀いおどうしたすか これに぀いお今䜕をしおいたすか



IntelずAMDからSparcずPowerPCたで、プロセッサずアヌキテクチャの倧手メヌカヌは、ほずんどの堎合、生産性を向䞊させる埓来の可胜性を䜿い果たしたした。 プロセッサの呚波数ずその線圢垯域幅を増加し続ける代わりに、圌らは倧芏暡にハむパヌスレッドおよびマルチコアアヌキテクチャに倉わりたす。 これらのアヌキテクチャは䞡方ずも、今日のプロセッサにすでに存圚しおいたす。 特に、最新のPowerPCおよびSparc IVプロセッサはマルチコアであり、2005幎にはIntelずAMDが珟圚のプロセッサに加わりたす。 ちなみに、2004幎秋に開催されたIn-Stat / MDR Fall Processor Forumの倧きなトピックは、倚くの䌁業が新しいマルチコアプロセッサを発衚したため、マルチコアデバむスのトピックにすぎたせんでした。 2004幎がマルチコアの幎だったず蚀っおも過蚀ではありたせん。



そのため、少なくずも数幎前に、汎甚デスクトップコンピュヌタヌ甚およびサヌバヌの䞋䜍セグメント甚に蚭蚈されたアプリケヌションちなみに、珟圚販売されおいるすべおのプログラムの倧きなシェアを占めるアプリケヌションの゜フトりェア開発の根本的な転換点に近づいおいたす垂堎で。 この蚘事では、ハヌドりェアの倉曎方法、これらの倉曎が突然重芁になった理由、䞊列化革呜があなたにどのように圱響するか、そしお将来どのようにプログラムを曞く可胜性が高いかに぀いお説明したす。



おそらく、無料のスヌプは1幎か2幎前にすでに終了したのでしょう。 気づき始めたした。



無料のパフォヌマンススヌプ



「アンディがいくら出しおもビルはすべおを奪う」「アンディはギブを奪い、ビルは奪う」ずいう興味深い蚀葉を聞いたこずがあるでしょう。 コメント翻蚳者-これはIntelの責任者であるAndy GroveずMicrosoftの責任者であるBill Gatesを指したす。 プロセッサの数がどれだけ速床を䞊げおも、プログラムはこの速床を䜕に費やすかを垞に把握したす。 プロセッサを10倍高速化するず、プログラムはそれに察しお10倍の䜜業を芋぀けたすたたは、堎合によっおは、同じ䜜業を10倍効率的に実行できたす。 ほずんどのアプリケヌションは、数十幎にわたっおたすたす高速に実行されおおり、新しいバヌゞョンをリリヌスしたり、コヌドに根本的な倉曎を加えたりしなくおも、䜕もしたせん。 プロセッサの補造業者たずずメモリずハヌドドラむブの補造業者すべおが次々ず、より高速で新しいコンピュヌタヌシステムを䜜成したずいうこずです。 プロセッサのクロック速床は、そのパフォヌマンスを評䟡するための唯䞀の基準ではなく、最も正しいものでもありたせんが、それでも倚くのこずを蚀っおいたす500 MHzプロセッサがクロック呚波数1 GHzのプロセッサに眮き換えられ、その埌-2 GHz-新しいプロセッサなど。 そこで、クロック呚波数が3 GHzのプロセッサヌがごく普通の段階を経おいたす。



今、私たちは自問したすこのレヌスはい぀終わりたすか ムヌアの法則は指数関数的成長を予枬したす。 このような成長は氞遠に続くこずはできず、必然的に物理的な限界に達するこずは明らかです。結局のずころ、光の速床は長幎にわたっお速くならないからです。 したがっお、遅かれ早かれ、成長は鈍化し、さらには停止するでしょう。 小さな説明はい、ムヌアの法則は䞻にトランゞスタの密床に぀いお述べおいたすが、クロック呚波数などの領域でも指数関数的な成長が芳察されたず蚀えたす。他の分野では、ストレヌゞ容量の成長など、成長はさらに倧きくなりたしたが、別の蚘事のトピック。



あなたが゜フトりェア開発者である堎合、デスクトップパフォヌマンスの向䞊をきっかけに長い間リラックスしおいる可胜性が高いでしょう。 䜕らかの操䜜を実行しおいる間、プログラムはゆっくり実行されたすか 「なぜ心配」ずあなたは蚀いたす、「明日はもっず速いプロセッサが出おくるでしょうが、䞀般的にプログラムは遅いプロセッサず遅いメモリのためだけでなく遅くなりたすたずえば、呌び出しのために遅いI / Oデバむスのためにデヌタベヌスぞ。」 正しい思考の列



本圓です。 昚日。 しかし、予芋可胜な未来に぀いおは絶察に間違っおいたす。



良いニュヌスは、プロセッサがたすたす匷力になるこずです。 悪いニュヌスは、少なくずも近い将来には、プロセッサのパワヌの増加が、ほずんどの既存のプログラムの䜜業を自動的に加速しない方向に進むずいうこずです。



過去30幎間、プロセッサ開発者は3぀の䞻芁な分野でパフォヌマンスを向䞊させるこずができたした。 それらの最初の2぀は、プログラムコヌドの実行に関連しおいたす。



クロック速床の増加は、速床の増加を意味したす。 プロセッサの速床を䞊げるず、倚かれ少なかれ、同じコヌドをより高速に実行できるようになりたす。



プログラムコヌドの実行を最適化するずいうこずは、1クロックサむクルでより倚くの䜜業を行うこずを意味したす。 今日のプロセッサには非垞に匷力な呜什が搭茉されおおり、コヌド実行のパむプラむン化、分岐予枬、同じクロックサむクルでの耇数の呜什の実行、プログラムコマンドの異なる順序での実行呜什䞊べ替え。 これらのテクノロゞヌはすべお、各クロックサむクルから可胜な限り圧瞮しお、遅延を最小限に抑え、サむクルあたりの操䜜数を増やすために、コヌドが可胜な限り最良か぀/たたはできるだけ速く実行されるように考案されたした。



異なる順序呜什の䞊べ替えずメモリモデルメモリモデルでの呜什の実行に関する小さな䜙談「最適化」ずいう蚀葉で、私は本圓にもっず䜕かを意味したこずに泚意したいず思いたす。 これらの「最適化」は、プログラムの意味を倉え、プログラマの期埅に反する結果をもたらす可胜性がありたす。 これは非垞に重芁です。 プロセッサ開発者は倢䞭にならず、人生でパを害するこずはありたせん。通垞の状況では、コヌドを台無しにするこずは決しおありたせん。 しかし、過去数幎間、各プロセッサのクロックサむクルをさらに絞るこずを唯䞀の目的ずしお、積極的な最適化を決定しおいたす。 ただし、これらの積極的な最適化はコヌドのセマンティクスを危険にさらすこずをよく認識しおいたす。 たあ、圌らはこれを害からやっおいたすか たったくありたせん。 圌らの望みは、たすたす高速のプロセッサを必芁ずする垂堎の圧力に察する反応です。 このプレッシャヌは非垞に倧きいため、プログラムの速床がこのように増加するず、プログラムの正確さが損なわれ、動䜜する胜力さえ損なわれたす。



最も顕著な2぀の䟋を挙げたしょう。デヌタ曞き蟌み操䜜の順序の倉曎曞き蟌みの䞊べ替えず、読み取り順序読み取りの䞊べ替えです。 デヌタ曞き蟌み操䜜の順序を倉曎するず、このような驚くべき結果に぀ながり、倚くのプログラマヌを混乱させたす。倚くのプログラマヌは、この機胜をオンにするず、曞き蟌たれたプログラムの動䜜を正しく刀断するこずが難しくなりすぎるため、通垞はこの機胜を無効にする必芁がありたす。 デヌタ読み取り操䜜の順列も驚くべき結果に぀ながる可胜性がありたすが、プログラマヌには特別な困難はなく、オペレヌティングシステムず゜フトりェア補品のパフォヌマンス芁件により、プログラマヌは少なくずもある皋床劥協しおしぶしぶ遞択するため、この機胜は通垞残されたす最適化の「悪魔」の少ない。



最埌に、組み蟌みキャッシュのサむズを増やすこずは、RAMぞのアクセスをできるだけ少なくするこずを意味したす。 コンピュヌタヌのRAMはプロセッサヌよりもはるかに遅いため、デヌタをRAMで実行しないように、できるだけプロセッサヌの近くにデヌタを配眮するこずをお勧めしたす。 最も近いのは、プロセッサ自䜓が配眮されおいるシリコンの同じ郚分にそれらを保存するこずです。 近幎のキャッシュサむズの増加は圧倒的です。 珟圚、2MB以䞊の第2レベルL2の組み蟌みキャッシュメモリを備えたプロセッサを䜿甚しおいる人を驚かせるこずはできたせん。 プロセッサのパフォヌマンスを向䞊させるための3぀の歎史的なアプロヌチのうち、キャッシュの成長が近い将来の唯䞀の有望なアプロヌチになりたす。キャッシュの重芁性に぀いおは、以䞋でもう少し説明したす。



いいね なぜ私はこれすべおですか



このリストの䞻な意味は、リストされおいるすべおの方向が䞊列性に関係しおいないこずです。 これらすべおの分野でのブレヌクスルヌにより、シヌケンシャル非䞊列、単䞀プロセスアプリケヌションず䞊列凊理を䜿甚するアプリケヌションの䞡方が高速化されたす。 今日のアプリケヌションのほずんどはシングルスレッドであるため、この結論は重芁です。これに぀いおは、以䞋で説明したす。



もちろん、コンパむラヌもプロセッサヌに遅れずに぀いおいく必芁がありたした。 新しい呜什MMX、SSEなど、新機胜、新機胜の恩恵を受けるために、アプリケヌションを再コンパむルし、特定のプロセッサモデルを最䜎限蚱容できるものずしお遞択する必芁が時々ありたした。 しかし、䞀般的に、叀いプログラムでさえ、最新のプロセッサヌからの最新の呜什を再コンパむルおよび䜿甚しなくおも、叀いプロセッサヌよりも垞に新しいプロセッサヌでずっず速く動䜜したした。



この䞖界がどれほど矎しいか。 残念ながら、この䞖界はもはや存圚したせん。



障害、たたは10 GHzプロセッサが衚瀺されない理由



2幎前の私たちにずっおのプロセッサパフォヌマンスの通垞の向䞊は、壁にぶ぀かりたした。 私たちのほずんどはすでにこれに気づき始めおいたす。



他のプロセッサに぀いおも同様のグラフを䜜成できたすが、この蚘事ではIntelプロセッサのデヌタを䜿甚したす。 図1は、どのIntelプロセッサヌが垂堎に導入されたか、そのクロック呚波数、およびトランゞスタ数を瀺すグラフを瀺しおいたす。 ご芧のずおり、トランゞスタの数は増え続けおいたす。 しかし、クロック呚波数には問題がありたす。



画像



2003幎の領域では、クロック呚波数のグラフは、継続的成長の通垞の傟向から急激か぀奇劙に逞脱しおいるこずに泚意しおください。 トレンドをより明確にするために、ポむント間に線を匕きたした。 成長を続ける代わりに、チャヌトは突然氎平になりたす。 クロック呚波数の増加はたすたす䞎えられおおり、1぀ではなく、成長経路に察する倚くの物理的な障害がありたす。たずえば、加熱プロセッサヌ熱が過剰に発生し、それを攟散するのが難しすぎる、゚ネルギヌ消費高すぎる、および浮遊電流の挏れです。



簡単な䜙談芋お、お䜿いのコンピュヌタヌのプロセッサヌ呚波数は たぶん10 GHzですか Intelプロセッサはかなり前2001幎8月に2 GHzレベルに達したしたが、2003幎以前に存圚したクロック呚波数の成長傟向が続いた堎合、2005幎の初めに、呚波数が10 GHzの最初のPentiumプロセッサが珟れたでしょう。 芋回しお、芋えたすか さらに、このようなクロック速床のプランさえ誰も持っおおらず、そのようなプランがい぀珟れるかさえわかりたせん。



さお、4GHzプロセッサはどうですか すでに、呚波数が3.4 GHzのプロセッサがありたすので、4 GHzはすぐそこにありたすか 残念ながら、4 GHzにも到達できたせん。 2004幎半ばに、Intelが4GHzプロセッサのリリヌスを2005幎に延期し、2004幎秋にこれらの蚈画を完党に拒吊したこずを公匏に発衚したこずを芚えおいるでしょう。 この蚘事の執筆時点で、Intelは2005幎初頭に呚波数3.73 GHzのプロセッサを起動するこずで少し前進する予定です図1では、呚波数成長グラフの最高点ですが、少なくずもヘルツの競争は終わったず蚀えたす今日の瞬間。 将来、Intelおよびほずんどのプロセッサメヌカヌは、他の方法で成長を远求したす。それらはすべお、マルチコア゜リュヌションに積極的に移行しおいたす。



い぀かデスクトップコンピュヌタに4GHzプロセッサが衚瀺されるかもしれたせんが、2005幎には衚瀺されたせん。 もちろん、Intelの研究所には、より高速で動䜜するプロトタむプがありたすが、これらの速床は、䟋えば倧型の冷华装眮の助けを借りお、英雄的な努力によっお達成されおいたす。 そのような冷华装眮がオフィスに登堎するこずを期埅しないでください。たた、ラップトップで䜜業したい飛行機には絶察に期埅しないでください。



BSNBムヌアの法則ず次䞖代プロセッサ



「無料のスヌプはありたせんBSNB」-R.A.ハむンラむン、「月は厳しい愛人です」



これは、ムヌアの法則がもはや有効ではないずいうこずですか 最も興味深いのは、答えがノヌだずいうこずです。 もちろん、指数関数的な進歩のように、ムヌア法はい぀か機胜しなくなりたすが、今埌数幎間は法が危険にさらされないようです。 プロセッサの蚭蚈者はもはやクロック呚波数を䞊げるこずができないずいう事実にもかかわらず、プロセッサ内のトランゞスタの数は爆発的なペヌスで増え続けおおり、今埌数幎間、ムヌアの法則による成長は続きたす。



この蚘事が曞かれた以前のトレンドずの䞻な違いは、いく぀かの将来の䞖代のプロセッサヌのパフォヌマンスが基本的に他の方法で達成されるこずです。 そしお、これらの新しい、より匷力なプロセッサ䞊の珟圚のアプリケヌションのほずんどは、蚭蚈に倧幅な倉曎が加えられない限り、自動的に高速に実行されなくなりたす。



近い将来、より正確には今埌数幎間で、新しいプロセッサのパフォヌマンスの向䞊は3぀の䞻な方法で達成され、そのうちの1぀だけが前のリストから残っおいたす。 すなわち



ハむパヌスレッディングは、同じプロセッサで2぀以䞊のスレッドを䞊行しお実行する技術です。 ハむパヌスレッドプロセッサは既に垂販されおおり、耇数の呜什を䞊行しお実行するこずができたす。 ただし、ハむパヌスレッドプロセッサには、このタスクを実行するためのハヌドりェアレゞスタなどが远加されおいるにもかかわらず、キャッシュ、敎数挔算甚の蚈算ナニット、浮動小数点挔算甚のナニットが1぀しかありたせん。単玔なプロセッサで利甚可胜なものを䞀床に1぀。 ハむパヌスレッディングにより、合理的に蚘述されたマルチスレッドプログラムのパフォヌマンスが5〜15向䞊し、理想的な条件䞋で適切に蚘述されたマルチスレッドプログラムのパフォヌマンスが最倧40向䞊するず考えられおいたす。 悪くはありたせんが、これは生産性の倍増にはほど遠いものであり、シングルスレッドプログラムは䜕も勝おたせん。



マルチコアマルチコアは、2぀以䞊のプロセッサを同じチップに配眮する技術です。 SPARCやPowerPCなどの䞀郚のプロセッサは、マルチコアバヌゞョンですでに利甚可胜です。 2005幎に実装されたIntelずAMDによる最初の詊みは、プロセッサ統合の皋床が互いに異なりたすが、機胜的には非垞に䌌おいたす。 AMDプロセッサヌは、単䞀チップ䞊に耇数のコアを搭茉しおいるため、パフォヌマンスが倧幅に向䞊したすが、最初のIntelマルチコアプロセッサヌは、1぀の倧きな基板䞊の2぀の共圹Xeonプロセッサヌのみで構成されたす。 このような゜リュヌションから埗られる利益は、デュアルプロセッサシステムの存圚から埗られるものず同じですマザヌボヌドは、調敎のために2぀のチップず远加のマむクロ回路をむンストヌルするために2぀の゜ケットを必芁ずしないため、より安䟡です。 理想的な条件䞋では、プログラムの実行速床はほが2倍になりたすが、マルチスレッドアプリケヌションはかなり適切に䜜成されおいたす。 シングルスレッドアプリケヌションは成長したせん。



最埌に、少なくずも近い将来、オンダむキャッシュの増加が予想されたす。 3぀の傟向すべおのうち、これだけがほずんどの既存のアプリケヌションの生産性の向䞊に぀ながりたす。 すべおのアプリケヌションの組み蟌みキャッシュのサむズを倧きくするこずは、サむズが速床を意味するずいう理由だけで重芁です。 RAMぞのアクセスは高すぎるため、RAMぞのアクセスはできる限り少なくしたいず考えおいたす。 キャッシュミスの堎合、RAMからデヌタを抜出するよりも、キャッシュから抜出するよりも10〜50倍時間がかかりたす。 RAMは非垞に高速に動䜜するず䞀般に信じられおいたため、これは䟝然ずしお人々にずっお驚くべきこずです。 はい、ドラむブやネットワヌクに比べお高速ですが、キャッシュはさらに高速です。 アプリケヌションが䜿甚するデヌタの党量がキャッシュされおいる堎合、チョコレヌトに保存されおおり、そうでない堎合は別のものに保存されおいたす。 そのため、キャッシュサむズが倧きくなるず、今日のプログラムの䞀郚が保存され、倧幅な倉曎なしで数幎間はもう少し呜が吹き蟌たれたす。 倧恐pression時代に圌らが蚀ったように、「キャッシュはほずんどありたせん。」 「キャッシュは王様」



簡単な䜙談ここで、「サむズは速床を意味したす」ずいうステヌトメントのデモンストレヌションずしお、コンパむラヌに起こったストヌリヌがありたす。32ビット版ず64ビット版のコンパむラヌは同じ゜ヌスコヌドから䜜成されたす。 32ビットたたは64ビットを䜜成する必芁がありたす。64ビットプロセッサに倚くのレゞスタがあり、高速化のための最適化関数もあるため、64ビットプロセッサで64ビットコンパむラをより高速に実行するこずが期埅されおいたした。コヌド実行。Sun デヌタはどうですか64ビットに切り替えおも、メモリ内のほずんどのデヌタ構造のサむズは倉曎されたせんでしたが、もちろん、ポむンタは2倍になりたした。ポむンタヌのサむズが4バむトではなく8バむトになったため、コンパむラヌが凊理しなければならないデヌタの合蚈サむズが増加したした。デヌタ量の増加は、高速化によりパフォヌマンスが䜎䞋しただけでした。 プロセッサず远加レゞスタの可甚性。 この蚘事の執筆時点では、䞡方のコンパむラが同じ゜ヌスコヌドからアセンブルされおおり、64ビットプロセッサは32ビットよりも匷力であるにもかかわらず、64ビットコンパむラは32ビットコンパむラず同じ速床で実行されおいたす。 サむズは速床を意味したす



本圓に、キャッシュがボヌルを支配したす。 ハむパヌスレッディングもマルチコアも、今日のプログラムのほずんどの速床を向䞊させないためです。



それでは、これらのハヌドりェアの倉曎はプログラマにずっお䜕を意味するのでしょうか あなたはおそらく答えが䜕であるかをすでに理解しおいるので、それに぀いお議論しお結論を​​導きたしょう。



神話ず珟実2 x 3GHz <6GHz



デュアルコアプロセッサが2぀の3GHzコアで構成されおいる堎合、6GHzプロセッサのパフォヌマンスが埗られたす。 そう



いや 2぀のスレッドが2぀の物理的に別々のプロセッサで実行される堎合、これはプログラムの党䜓的なパフォヌマンスが2倍になるずいう意味ではありたせん。 同様に、マルチスレッドプログラムは、デュアルコアプロセッサでは2倍の速床で動䜜したせん。 はい、シングルコアプロセッサよりも高速に動䜜したすが、速床は盎線的に増加したせん。



どうしお たず、2぀のプロセッサのキャッシュの内容を䞀臎させるコストキャッシュの䞀貫性キャッシュず共有メモリの䞀貫した状態、および他の盞互䜜甚のコストがありたす。 珟圚、マルチスレッドアプリケヌションを実行する堎合でも、2プロセッサたたは4プロセッサのマシンは、シングルプロセッサのマシンよりも2倍たたは4倍高速ではありたせん。 いく぀かの別個のプロセッサではなく、同じチップ䞊にいく぀かのコアがある堎合、問題は本質的に同じたたです。



第二に、耇数のコアが完党に䜿甚されるのは、2぀の異なるプロセス、たたは同じプロセスの2぀の異なるスレッドを実行する堎合のみです。



以前の声明に盎面しお、通垞のナヌザヌ向けのシングルスレッドアプリケヌションがデュアルコアプロセッサ䞊でより高速に実行される実際の状況を想像できたす。これは、以前はナニプロセッサマシンのコンピュヌティングリ゜ヌスを䜿い果たしおいた䜕らかのトロむの朚銬たたはりむルスを実行したす。最初のプロセッサに加えお別のプロセッサを賌入しお、りむルスずりむルスを有効にするかどうかはあなたに任せたす おやん。



アプリケヌションがシングルスレッドの堎合、䜿甚するプロセッサコアは1぀だけです。 もちろん、オペレヌティングシステムたたはバックグラりンドアプリケヌションは他のカヌネルで実行されるため、ある皋床の加速がありたすが、原則ずしお、オペレヌティングシステムはプロセッサを100読み蟌たないため、近隣のコアはほずんどアむドル状態になりたす。 たたは、トロむの朚銬たたはりむルスがスピンしたす



゜フトりェアの重芁性別の革呜



90幎代埌半に、オブゞェクトを操䜜するこずを孊びたした。 プログラミングでは、構造プログラミングからオブゞェクト指向プログラミングぞの移行がありたした。これは、過去20幎、あるいは30幎にわたっおプログラミングの最も重芁な革呜になりたした。 最近のWebサヌビスの出珟など、他の革呜もありたしたが、私たちのキャリア党䜓では、オブゞェクト革呜よりも根本的で重芁な結果をもたらす革呜は芋おいたせん。



今日たで。



今日から、「スヌプ」の代金を支払う必芁がありたす。 もちろん、䞻にキャッシュサむズの増加により、パフォヌマンスをある皋床無料で向䞊させるこずができたす。 ただし、新しいプロセッサの凊理胜力の指数関数的成長の恩恵を受けたい堎合は、正しく蚘述された䞊列化通垞はマルチスレッドアプリケヌションにする必芁がありたす。 すべおのタスクを簡単に䞊列化できるわけではなく、䞊列プログラムの䜜成が非垞に難しいため、蚀うのは簡単ですが、実行するのは困難です。



私はdigりの叫びを聞きたす「䞊行性 これはどんなニュヌスですか 人々は長い間、䞊列プログラムを曞いおきたした。」 そうだね。 しかし、これはプログラマの取るに足らないシェアにすぎたせん。



Simula蚀語がリリヌスされた60幎代の終わりから、人々はオブゞェクト指向プログラミングに関䞎しおきたした。圓時、OOPは革呜を匕き起こさず、プログラマヌの間で支配しおいたせんでした。 90幎代の始たりたで。なんで革呜は䞻に、さらに耇雑なタスクを解決し、より倚くのプロセッサずメモリリ゜ヌスを䜿甚するさらに耇雑なプログラムが必芁になったために発生したした。倧芏暡プログラムの経枈的で信頌性が高く予枬可胜な開発には、OOPの長所抜象化ずモゞュヌル化が圹立ちたした。



䞊行性も同様です。私たちは、コルヌチンやモニタヌなどのトリッキヌなナヌティリティを曞いた倪叀から知っおいたす。そしお過去10幎間で、たすたす倚くのプログラマヌが䞊列マルチプロセスたたはマルチスレッドシステムを䜜成し始めたした。しかし、革呜、転換点に぀いお話すのはただ早すぎたした。したがっお、珟圚、ほずんどのプログラムはシングルスレッドです。



ずころで、誇倧広告に぀いおは、「゜フトりェア開発の分野でもう1぀の革呜が間近に迫っおいる」ず圌らが䜕床も発衚しおきたした。原則ずしお、これを蚀った人は単に新補品を宣䌝しただけです。それらを信じないでください。新しいテクノロゞヌは垞に興味深いものであり、有甚であるこずが蚌明されおいたすが、最倧のプログラミング革呜により、数幎にわたっお垂堎に出回っおいるテクノロゞヌが生み出され、䞀時的に爆発的な成長が起こるたで静かに力を぀けおいたす。これは避けられないこずです。革呜は、十分に成熟した技術倚くの䌁業やツヌルから既にサポヌトされおいるのみに基づくこずができたす。通垞、新しいプログラミングテクノロゞが、レヌキやグリッチを螏むこずなく広く適甚されるほど信頌できるようになるたで、7幎が経過したす。結果ずしおOOPなどの真のプログラミング革呜は、数十幎ではないずしおも、長幎にわたっお研ぎ柄たされた技術を生み出しおいたす。ハリりッドでも、䞀晩でスヌパヌスタヌになったすべおの俳優は、その前に圌が数幎間映画を挔じおいたこずがわかりたす。



䞊行性は、プログラミングにおける次の倧きな革呜です。PLO革呜ず比范できるかどうかに぀いおは専門家の意芋が異なりたすが、これらの論争は専門家に任せたしょう。私たちの゚ンゞニアにずっお、䞊列性が芏暡の点でOOP予想されるに匹敵するこず、およびこの新しいテクノロゞヌを習埗する耇雑さず難しさにおいお重芁です。



䞊行性の利点ず、それがどれだけ費甚がかかるか



䞊行性、特にマルチスレッドがプログラムの倧郚分ですでに䜿甚されおいる理由は2぀ありたす。たず、独立した操䜜の実行を分離するため。たずえば、私のデヌタベヌスレプリケヌションサヌバヌでは、各レプリケヌションセッションを独自のストリヌムに入れるのが自然でした。なぜなら、それらは互いに完党に独立しお動䜜したためです同じデヌタベヌスの同じレコヌドで動䜜しなかった堎合。第二に、プログラムが耇数の物理プロセッサで実行されるか、もう䞀方がアむドル状態のずきに1぀のプロシヌゞャの実行が亀互に行われるため、プログラムがより高速に動䜜するためです。私のデヌタベヌス耇補プログラムでは、この原則も䜿甚されおいたため、プログラムはマルチプロセッサマシン䞊で適切に拡匵されたした。



ただし、䞊行性は支払わなければなりたせん。明らかな困難はありたせん。たずえば、はい、ブロックするずプログラムの速床が䜎䞋したすが、賢明か぀正しく䜿甚するず、ブロックを䜿甚するこずで倱うよりも、マルチスレッドプログラムの䜜業を高速化するこずができたす。これを行うには、プログラム内の操䜜を䞊列化し、操䜜間のデヌタ亀換を最小限に抑えるか、完党に砎棄する必芁がありたす。



おそらく、アプリケヌションの䞊列化ぞの道の2番目の䞻な難点は、すべおのプログラムを䞊列化できるわけではないずいう事実です。これに぀いおは、以䞋で詳しく説明したす。



それにもかかわらず、䞊列凊理の䞻な難しさはそれ自䜓にありたす。䞊列プログラミングモデル、぀たりプログラマヌの頭の䞭で開発され、圌の助けを借りおプログラムの動䜜を刀断するむメヌゞのモデルは、順次コヌド実行のモデルよりもはるかに耇雑です。



ある時点で䞊列性の研究に着手する人は誰でも、圌がそれを完党に理解したず信じおいたす。その埌、䞍可解な人皮の状況に盎面しお、圌は突然、完党な理解に぀いお話すのは時期尚早であるこずに気付きたす。さらに、プログラマヌは䞊列コヌドでの䜜業を孊習するため、コヌドを慎重にテストすれば異垞な競合状態を回避できるこずに気付き、想像䞊の知識ず理解の第2レベルに進みたす。しかし、テスト䞭、実際のマルチプロセッサシステムでのみ発生する䞊列プログラミング゚ラヌは、単䞀のプロセッサでコンテキストを切り替えるだけでなく、スレッドが実際に同時に実行され、新しいクラスの゚ラヌを匕き起こしおスレッドが実行される通垞のマルチプロセッサシステムでのみ発生したす。だから、今圌は確かに知っおいるず思ったプログラマヌ䞊列プログラムの䜜成方法に新たな打撃が䞎えられたす。長時間の集䞭的なテストでアプリケヌションが正垞に動䜜し、クラむアントにずっお完璧に機胜した倚くのチヌムに䌚いたした。ある日、クラむアントの1人がマルチプロセッサマシンにプログラムをむンストヌルし、あちこちで䞍可解な競合状態ずデヌタ砎損が発生し始めたした。



そのため、最新のプロセッサのコンテキストでは、アプリケヌションをマルチコアマシンで動䜜するためのマルチスレッドアプリケヌションに倉換するこずは、プヌルの暪から深い郚分にゞャンプしお泳ぎ方を習埗しようずするこずに䌌おいたす。しかし、たずえあなたのチヌムが正しい䞊列コヌドを曞く方法を本圓に知っおいたずしおも、他のトリックがありたす䟋えば、あなたのコヌドは䞊列プログラミングの芳点からは完党に正しいかもしれたせんが、シングルスレッドバヌゞョンより速く動䜜したせん。通垞、これは、新しいバヌゞョンのストリヌムが互いに十分に独立しおいないか、共通のリ゜ヌスにアクセスしおいないために発生したす。その結果、プログラムの実行は䞊列ではなく順次になりたす。繊现さはたすたす高たっおいたす。



構造プログラミングからオブゞェクト指向プログラミングに切り替えるずき、プログラマはたったく同じ困難を抱えおいたしたオブゞェクトずは䜕ですか仮想関数ずは䜕ですかなぜ継承が必芁ですかそしお、これらの「䜕」ず「なぜ」に加えお、最も重芁なこずは正しいプログラムが構築される理由です圌らは本圓に正しいですか、それはシヌケンシャルプログラミングからパラレルプログラミングに切り替えた堎合にも圓おはたりたす「レヌス」ずは䜕ですか「デッドロック」ずは䜕ですかそれは䜕から来お、どのように回避したすかどの゜フトりェアコン゜ヌル正しいプログラミング構造は確かに正しい理由 - 私たちは、これらすべおの「䜕」ず「なぜ」、最も重芁なこずのほかに、メッセヌゞキュヌメッセヌゞキュヌで友達を䜜るずしなければならない理由ruktsii私の䞊列プログラムの䞀貫性を保぀ため



今日のプログラマヌのほずんどは、䞊行性に粟通しおいたせん。同様に、15幎前、ほずんどのプログラマヌはOOPを理解しおいたせんでした。ただし、特にメッセヌゞ転送ずロックベヌスのプログラミングの抂念を十分に理解しおいる堎合は、䞊列プログラミングモデルを孊習できたす。その埌、䞊列プログラミングはOOPほど難しくなく、かなり銎染みのあるものになるこずを願っおいたす。あなたずあなたのチヌムが再蚓緎にいくらかの時間を費やす必芁があるこずをただ芚悟しおください。



私は意図的に䞊列プログラミングをメッセヌゞの受け枡しずロックの抂念に枛らしたした。ロックのない䞊列プログラムを曞く方法がありたす同時ロックフリヌプログラミング。この方法はJava 5および少なくずも私が知っおいるコンパむラの1぀で最高の蚀語レベルでサポヌトされおいたすC ++。ただし、ロックなしの䞊列プログラミングは、ロックありのプログラミングよりも孊習がはるかに難しく、ほずんどの堎合、システムおよびラむブラリ゜フトりェアの開発者のみが必芁になりたすが、各プログラマヌは、そのようなシステムずラむブラリヌは、それらのアプリケヌションから利益を埗るために機胜したす。正盎なずころ、ロックを䜿甚したプログラミングもそれほど簡単で単玔ではありたせん。



これはすべお私たちにずっお䜕を意味するのでしょうか



わかったプログラマヌにずっおこれが䜕を意味するかに぀いお話を戻したしょう。



1.すでに取り䞊げた最初の䞻な結果は、すでに垂堎に出始めおいるプロセッサヌの垯域幅を100䜿甚し、今埌数幎でスコアを修正する堎合、アプリケヌションを䞊列化するこずです。たずえば、Intelは近い将来、100コアのプロセッサを䜜成するず䞻匵しおいたす。シングルスレッドアプリケヌションでは、このプロセッサの1/100の電力しか䜿甚できたせん。



はい、すべおのアプリケヌションより正確には、アプリケヌションによっお実行される重芁な操䜜を䞊列化できるわけではありたせん。はい、コンパむルなどの䞀郚のタスクでは、䞊行性はほが完璧です。しかし、他の人のために、いいえ。通垞、反䟋ずしお、1人の女性が赀ちゃんを産むために9ヶ月かかったずしおも、9人の女性が1ヶ月で赀ちゃんを産むこずができるずいう意味ではないずいう䞀般的なフレヌズを思い出したす。あなたはおそらくこのアナロゞヌにしばしば䌚ったでしょう。しかし、このアナロゞヌの欺deに気づいおいたすかあなたが再びそれに぀いお蚀及されるずき、簡単な質問をしたす「子䟛に出産する仕事は定矩によっお䞊列化できないずいうこの類掚から結論を出すこずができたすか」通垞、人々はそれに応じお考えお、すぐに「はい、この問題を䞊列化するこずはできたせん。」しかし、これは完党に真実ではありたせん。もちろん私たちの目暙が䞀人の子䟛を産むこずである堎合、䞊列化するこずはできたせん。しかし、できるだけ倚くの子䟛月に1人の子䟛を産むずいう目暙を蚭定すれば、完党に䞊列化できたすですから、本圓の目暙を知るこずは、すべおをひっくり返すこずができたす。プログラムを倉曎するかどうか、およびその方法を決定するずきは、この目的の原則を忘れないでください。



2.それほど明癜ではない結果は、おそらくプロセッサCPUバりンドによりアプリケヌションの速床がたすたす䜎䞋するこずです。もちろん、これはすべおのアプリケヌションで発生するわけではなく、これが発生する可胜性のあるアプリケヌションは明日文字通り遅くなるこずはありたせん。それでも、I / Oシステム、たたはネットワヌクやデヌタベヌスぞのアクセスが原因でアプリケヌションの速床が䜎䞋した堎合、おそらく制限に達したした。これらの分野では、速床はたすたす高くなっおいたすギガビットWi-Fiに぀いお聞いたこずはありたすかそしお、プロセッサを加速する埓来の方法はすべお䜿い果たされおいたす。考えおみおください。今は3 GHzでしっかりず立ち埀生しおいたす。したがっお、プロセッサキャッシュのサむズを倧きくしない限り少なくずもいく぀かの朗報、シングルスレッドプログラムは高速に動䜜したせん。この方向でのその他の進歩は、以前ほど倧きくありたせん。たずえば、回路゚ンゞニアがプロセッサパむプラむンを仕事で満たし、アむドル状態にならないようにする新しい方法を芋぀けるこずはほずんどありたせん。ここでは、明らかな解決策がすべお発芋され、実装されおいたす。垂堎は、プログラムにより倚くの機胜を垞に芁求したす。さらに、新しいアプリケヌションはより倚くのデヌタを凊理する必芁がありたす。より倚くの機胜をプログラムに導入し始めるず、プログラムは䞊列ではないためプロセッサの胜力が䞍足しおいるこずがすぐにわかりたす。垂堎は、プログラムにより倚くの機胜を垞に芁求したす。さらに、新しいアプリケヌションはより倚くのデヌタを凊理する必芁がありたす。より倚くの機胜をプログラムに導入し始めるず、プログラムは䞊列ではないためプロセッサの胜力が䞍足しおいるこずがすぐにわかりたす。垂堎は、プログラムにより倚くの機胜を垞に芁求したす。さらに、新しいアプリケヌションはより倚くのデヌタを凊理する必芁がありたす。より倚くの機胜をプログラムに導入し始めるず、プログラムは䞊列ではないためプロセッサの胜力が䞍足しおいるこずがすぐにわかりたす。



そしお、ここには2぀のオプションがありたす。たず、䞊蚘のように、アプリケヌションを䞊行しお䜜り盎したす。たたは、最も怠forな堎合は、コヌドを曞き盎しお、より効率的で無駄が少なくなるようにしたす。 3番目の結論に至りたす。3



.効率的で最適化されたコヌドの重芁性は、枛少するのではなく、成長するだけです。高レベルのコヌド最適化を実珟できる蚀語は、第二の人生を迎えたす。これを蚱可しない蚀語は、競争の新しい条件で生き残り、より効果的で最適化される方法を芋぀け出す必芁がありたす。私は長い間、高性胜の蚀語ずシステムに察する高い需芁があるず信じおいたす。



4.最埌に、プログラミング蚀語ず゜フトりェアシステムは同時実行性を十分にサポヌトする必芁がありたす。たずえば、Java蚀語は生たれたずきから䞊行性をサポヌトしおいたすが、このサポヌトで゚ラヌが発生し、マルチスレッドJavaプログラムが正しく効率的に機胜するためには、いく぀かのリリヌスで修正する必芁がありたした。 C ++は、匷力なマルチスレッドアプリケヌションを蚘述するために長い間䜿甚されおきたした。ただし、この蚀語の䞊列性は暙準に䜎䞋したせんC ++蚀語のすべおのISO暙準では、フロヌに぀いおも蚀及されおおらず、これは意図的に行われたした。したがっお、その実装のために、さたざたなプラットフォヌム䟝存ラむブラリに頌る必芁がありたす。 さらに、同時実行性のサポヌトは完党にはほど遠いです。たずえば、静的倉数は䞀床だけ初期化する必芁があり、コンパむラがロックを䜿甚しお初期化を瀺す必芁があり、倚くのC ++コンパむラがそうしない理由。最埌に、C ++にはpthreadやOpenMPを含むいく぀かの䞊行性暙準があり、それらのいく぀かは暗黙的ず明瀺的の2぀のタむプの䞊行性さえサポヌトしおいたす。そのようなコンパむラが、シングルスレッドコヌドを操䜜しお、それをなんずかしお䞊列に倉換し、その䞭から䞊列化できる郚分を芋぀けるこずができれば玠晎らしいです。ただし、そのような自動化されたアプロヌチには限界があり、プログラマヌによっお䞊列凊理が明瀺的に蚭定されおいるコヌドず比范しお、垞に良い結果が埗られるずは限りたせん。マスタリヌの䞻な秘密は、ロックを䜿甚したプログラミングであり、マスタヌするのは非垞に困難です。私たちは緊急に、より高床な䞊列プログラミングモデルを必芁ずしおいたす珟代の蚀語が提䟛するもの。これに぀いおは、別の蚘事で詳しく説明したす。



結論ずしお



ただ実行しおいない堎合は、今すぐ実行したす。アプリケヌションの蚭蚈を泚意深く確認し、埌でプロセッサの凊理胜力を必芁ずするたたは必芁ずする操䜜を決定し、これらの操䜜を䞊列化する方法を決定したす。さらに、今、あなたずあなたのチヌムは、䞊列プログラミング、そのすべおの秘密、スタむル、むディオムを習埗する必芁がありたす。



アプリケヌションのごく䞀郚のみが、劎力なしで䞊列化できたす。ほずんどの堎合、そうではありたせん。プログラムがプロセッサから最埌のゞュヌスを絞り出す堎所を正確に知っおいたずしおも、この操䜜を䞊列操䜜に倉えるのは非垞に難しいこずが刀明する堎合がありたす。今それに぀いお考え始めるより倚くの理由。暗黙的な䞊列化を備えたコンパむラヌは、郚分的にしか圹に立ちたせん;奇跡を期埅しないでください;自分で行うよりも、シングルスレッドアプリケヌションを䞊列アプリケヌションに倉えるこずはできたせん。



キャッシュサむズの増加ずコヌド実行の最適化のいく぀かの改善により、しばらくの間無料のスヌプが利甚可胜になりたすが、今日からは春雚ずニンゞンが1぀だけ含たれるようになりたす。豊富な肉はすべお、远加料金でのみスヌプに含たれたす-远加のプログラマヌの努力、远加のコヌドの耇雑さ、远加のテスト。ほずんどのアプリケヌションでは、これらの努力が無駄にならないこずは安心です。なぜなら、珟代のプロセッサの指数関数的な増加を十分に掻甚できるからです。



All Articles