[過去ログ] Go language part 3 (1002レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
783: デフォルトの名無しさん [sage] 2020/11/01(日) 09:56:36 ID:MfA1nG9+(1/13) AAS
あんまGo知らない、まで読んだ。
786: デフォルトの名無しさん [sage] 2020/11/01(日) 11:09:39 ID:MfA1nG9+(2/13) AAS
ホントにあんまり知らんのだろ。
恥かく前にやめとけ。
788(1): デフォルトの名無しさん [sage] 2020/11/01(日) 11:11:59 ID:MfA1nG9+(3/13) AAS
yieldが必要なコルーチンとは全く関係なく、昔で言うグリーンスレッドを超低コストで実現してるという方が正しい。
エアプしてる時間があったらスケジューラの動きとか調べてみたらいいよ。
789: デフォルトの名無しさん [sage] 2020/11/01(日) 11:12:40 ID:MfA1nG9+(4/13) AAS
スレッドプールとかが効いてくるネイティブスレッドではなくて、あくまでグリーンスレッドだからな。
791(2): デフォルトの名無しさん [sage] 2020/11/01(日) 11:35:22 ID:MfA1nG9+(5/13) AAS
メインスレッドすらグリーンスレッドで、数本立ってるネイティブスレッド上でタスクを持ち回りで実行してるから、await asyncは自動的にされてると思って良いぐらい。
802: デフォルトの名無しさん [sage] 2020/11/01(日) 13:58:56 ID:MfA1nG9+(6/13) AAS
>>793793(1): デフォルトの名無しさん [sage] 2020/11/01(日) 11:52:11 ID:0aiHjqpe(4/12) AAS
>>788
> グリーンスレッド
この言葉は初めて聞いたが、確かにJavaやRubyでは普通に使われてる言葉らしい。意味は確認した。
なるほど、スレッドだと論理CPUを跨げるので、その部分がOS管轄になるから重いのか。
goroutineがグリーンスレッドなら、マルチコアだと全く性能が出ないな。
まあそれはいいとして。
なら、そもそもネーミングが悪いよ。
gogreenthreadとか、まんまの名前の方が良かったよ。
(ただしGoは意図的に他言語に合わせてない部分があるからここもかもしれんが)
確かにthreadではないのは理解した。
>>790
> Xeon PhiなどではなくXeonやEPYCのようなパッケージのコア数の向上とそれを積んだ大規模分散環境の話だ
いやそれは同じだぞ。少なくともプログラミングモデルは変わらないだろ。
実は俺は785投稿した後に、「あ、もしかしてNiagara等(有名なのは京)のCPU内メニースレッドの話か?」と思ってしまったが、
そうじゃないのならそっちも間違ってるぞ。
上記の通り、それだとgoroutineでの性能向上は不可能だ。
そしてグリーンスレッドだというのなら、CPU内メニースレッドには非常にマッチする。
実際Niagaraとか64スレッドだが、正直64スレッドなんて普通のthreadでは埋めきれないし、
それ向けにプログラマが積極的に切り出せ、というのは技術的にはかなり納得する。
だからグリーンスレッドの多用での性能向上を目指した、というのが合ってるんだと思うよ。
その後の話はその通り。
確かに俺にとって有用ではないから俺は使わない、で終わりだ。
やってる連中はそれが役に立つと思ってるからやってるだけ、というのは確かにそりゃそうだ。
マルチコアで性能が出ない理由がわからん。
複数コアでタスクが空き次第実行してるから、単一コアのグリーンスレッドとは全然違ってフル回転するぞ。
803: デフォルトの名無しさん [sage] 2020/11/01(日) 14:00:05 ID:MfA1nG9+(7/13) AAS
>>795795(1): デフォルトの名無しさん [sage] 2020/11/01(日) 12:21:49 ID:0aiHjqpe(5/12) AAS
>>791
まあとにかくgreenthreadだというのは理解した。
(仕様を確認したわけではなく、そちらの主張通りの方が色々辻褄が合うからそうなのだと思う)
> await asyncは自動的にされてると思って良いぐらい。
それはgreenthreadの話ではなく、他の普通のマルチスレッド言語は全部そうだよ。
実際、PHPが使いやすいのはこれだし。
むしろJSだけが異端。ただし、俺はあれはそうする意味があったと思っている。
>>792
> コルーチンを指向していたならchannelなんて使わんだろう。
これは間違い。
コルーチンならyieldだけであり、channelでも全く問題なく機能する。
そしてchannelにするのは、(君はおそらく完全なソフトウェアプログラマだから理解出来ないのだろうが)
一般的には共有メモリを使わせず、一番速い同期機構にする為。通常はそれがchannelだとされている。
ただし共有メモリが遅くなるのはキャッシュコヒーレンシがらみであり、
greenthreadなら共有メモリ同期でも全く遅くもならない筈だから、本来は禁止にする必要もないし、チャネル縛りにする必要もない。
(実際Goだと禁止も縛りもされてなかった気はするので、言語的には辻褄は合ってるが)
ただし間欠動作ではない為、mutex等の同期化機構は必要で、それも嫌だというのならチャネルになる。
> どっちかというと軽量プロセスの方向性。
これは俺はそう言ってる。
phpはマルチスレッドと言うよりもマルチプロセスだろ。
他のマルチスレッド言語は言語によって全然違うよ。
pythonなんかは最近aioが整備されたじゃん。
select使うかどうかじゃね?
804: デフォルトの名無しさん [sage] 2020/11/01(日) 14:01:05 ID:MfA1nG9+(8/13) AAS
>>796796(1): デフォルトの名無しさん [sage] 2020/11/01(日) 13:36:21 ID:0aiHjqpe(6/12) AAS
>>791
ちなみにgreenスレッドスイッチは何で起動してるか分かるか?
なおgreenthreadについてはありがとう。これだと色々辻褄が合う。
781のブログも、「そもそもgoroutineってそんなに使いたいか?」という疑問があったのだが、
greenthreadでchannel同期なら、実装は単なるFIFO=リングバッファだから原理的に最速だ。
だから何でもかんでも「goroutineに出来る物はgoroutineにする」という方向性で悪ノリしたくなるのは分かる。
ただ、2KBはオーバースペック過ぎるから、それで頓死するのも分かる。
さてスレッドスイッチ、理想的にはキャッシュミスでgreenthreadスイッチが行われればいいのだが、
現状のx86ではこれは出来ないよな?
そもそも例外はOSに行ってしまうし、キャッシュミス時はそのCPUスレッドはそこでストールしてしまう。
一番近いのはTLBミス例外だが、それもOS行きだ。
ページフォールトしていたらプロセススイッチで終わり、
していなければそのまま処理が返ってきてキャッシュが充足されるまでストールしたまま待たされるはずだが、
そこでCPUが遊んでいる時間を他greenthreadで埋めてしまえ、というのは思想としては分かる。
ランタイム側で「TLBミスからの復帰」だと分かればgreenthreadスイッチ可能だが、
一般的には例外からの復帰はユーザープロセスからは見えないだろうから、おそらくカーネルに手を入れないと無理だ。
それでもやってしまえば面白い。ただ、この場合にgreenthread間でスラッシングした場合は悲惨なことになるが。
というわけで、スレッドスイッチ起動のネタは分かるか?
従来通りタイマなら、面白くもないがまあ、というところ。
greenthreadで最小構成ならスレッドスイッチのコストはPC/SP/Flags復帰分=関数1回呼び出し分でしかないから、スイッチし放題ではある。
だから豆にスイッチしまくりというのも面白いが、それでもキャッシュミスでのストールは避けられない。
そこでハードウェアサポートがあってキャッシュミス時にgreethreadスイッチが出来れば圧倒的に面白くなるが、
現状のx86だと出来ないよな?
コンテキストのスイッチとスケジューラはなかなかなるほど賢いなって思うぐらいのアルゴリズムになってるから、俺が説明するより本家読んできたほうが為になるぞ。
805(1): デフォルトの名無しさん [sage] 2020/11/01(日) 14:06:47 ID:MfA1nG9+(9/13) AAS
なんで性能向上が不可能なんだろ。
goroutineがたくさん起動する状態だと、同じような処理がタスクの切れ目でスイッチされることになって、キャッシュのヒット率も低くないし、ブランチ予測もそれなりにあてになる状況だろ。
GILかかる言語でもあるまいし。
806(2): デフォルトの名無しさん [sage] 2020/11/01(日) 14:10:11 ID:MfA1nG9+(10/13) AAS
切り替えについてはこの辺が良いんじゃないか?
外部リンク:morsmachine.dk
外部リンク:niconegoto.hatenadiary.jp
810(1): デフォルトの名無しさん [sage] 2020/11/01(日) 17:12:55 ID:MfA1nG9+(11/13) AAS
>>807807(3): デフォルトの名無しさん [sage] 2020/11/01(日) 16:52:55 ID:0aiHjqpe(8/12) AAS
>>806
確認した。(日本語版だけ。英語版は後で読んで少なくとも感想は返す)
スライド若干間違ってる、というかこいつ自身同期分かってねえ感じだが、ソフト屋ならこんなもんだろう。
ただいずれにしろ結論として、「共有メモリは遅いから使うな」で良いし、実際それ以上の理解は現実的に必要ない。
>>805
話がずれているのは俺がgreenthreadの定義を狭く捉えすぎていたからだな。
その記事で言う N : 1 だと思っていた。
これまでの俺のgreenthreadについての書き込みは全てこの定義だ。
だから当然他CPUを掴めないので高速化しようがない。
ただしGoが M:N なのは分かった。
しかしこの場合にCPUを跨ぐ為には当然OSのサポートが必要で、
当然そのスライドでもメッセージをkernelに投げてる。
問題はM:Nだと大して美味しくもないことだよ。
いや、Go界では当然凄く美味しいことになってるんだろうけど、N:1だと使える爆速最小実装がまるで使えない。
なら次段階は通常は「常に同一コアに割り当てるスレッド」をグルーピングしてその間だけでもこれを利用しよう、となるところだが、これもやってない。
勿論こんな事をやると思想に反するからだろうけど。
ただまあ、思想として、スケジューラ周りをランタイムに丸投げして「どんなスケールでも最大効率」を目指してるのは分かった。
とはいっても、メッセージをkernelに投げざるを得ない構造になってるから、改善余地があるとすればスケジューラ程度でしかない。
そして、俺は別段OSのスケジューラが間抜けとも思えないけど。
あれ、CPUが余ってたら振ってくるだけだし、実際演算とかで100%CPU掴む環境ならそれで必要十分だからね。
あるだけよこせならpriorityを上げればいいだけだし。
あと強いて言うならスレッドのスタックサイズが小さく済むことか?
しかしあれ、俺は知らんがthreadがOS管轄ならOS単位でしか指定出来ないものなのか?
それも奇妙だと思うから、普通はシステムコール時に引数与えて指定出来て然るべきであって、
今のLinuxがそうなってなくても当然いつかそうなるものだとも思うけど。
少なくとも.NETはnew Treaadでスレッドの最大サイズを指定出来る。
こいつもランタイムが管理するスレッドかもしれんけどさ。
ソフト屋ソフト屋と言ってるが、何屋なんよ。
解ってないと言うか、お前が何か変な想定してると思うぞ。
M:Nで、かつスケジューラがまともな場合、に関しては相当美味しいと言う事が理解できて、スケジューラのソースはgithubにあるはずだが、読んだ?
stealは無差別にstealする訳じゃないぞ。
1コアあるだけよこせだと、IOバウンドな処理の時に勿体ないでしょ。
小さく済むと言うか、バカほど立てられるんよ。
.Netの話はネイティブスレッド。お前ホント理解できてないのな。
811: デフォルトの名無しさん [sage] 2020/11/01(日) 17:13:59 ID:MfA1nG9+(12/13) AAS
>>807
常に同一コア云々に関しては、ソース読め。
812(1): デフォルトの名無しさん [sage] 2020/11/01(日) 17:19:00 ID:MfA1nG9+(13/13) AAS
>>807
CPUをまたぐ場合にはOSのサポート、もちょっと違うだろ。
あくまでグリーンスレッドで、ネイティブスレッドじゃねえぞ。
システムコールだったり、アトミックに処理ができるだったりでタスク覗くときにどうなってるよって話じゃねえの?
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.039s