- 825 名前:,,・´∀`・,,)っ-○◎● mailto:sage [2009/01/24(土) 00:30:33 ]
- >>820
おちつけ > ルールが「チェックサム合ってれば乱数生成しなくても良い」 乱数なんて所詮擬似的なモノです。 mt[]の配列以外のワークメモリを別に確保して、その上で乱数生成もやる それが認められるなら高速化はいくらでもやりようがある。 CUDAの1SMあたりのレジスタ本数は32ビット×8192=32KB 配列の要素を全部レジスタに割り当てて計算し、あとでメモリ上のmt[]に書き戻した方が効率がいい。 mt[]の配列をレジスタに割り当てて計算したらMT互換ではないのか?決してそんなことではない。 レジスタに余裕があるアーキテクチャでは、最適化の過程でそんなことは自動でやってくれる 処理系も存在する。 【というわけで】 mt[]を舐めることさえやめれば、いくらかは高速化の余地があるよ。 たとえば、コアループの内側でmt[]のいくつかレジスタに割り当ててしまって、 全部レジスタ上でこね回すとすれば、128ビット×156本のレジスタが必要になり、SPUの128本本数では足りない。 そんなことをSPUで実際やれば56本固定で食っちまう。せいぜいロード・ストア回数が減るくらいしか実用性はないし アンロールに使えるワークレジスタが実質的に減ってしまって逆に性能低下になりかねない。 そこでだ、レジスタを節約しつつ、スループットを稼げるように、データのレイアウトそのものを弄ってしまえばいいんじゃないかと。 ワークメモリはレジスタに割当て続ける必要はなく、LS上の空きにスワップしていい。 もちろん、これはさんすうやではなく、計算機屋としての理屈だ。 どこまでが王道でどこからが邪道なのか、無用な線引きを脳内で作ってしまっても「勝ち」はないわけで とりあえず中の人に明確化してもらいたいところだ。 俺はgcc43って指定してあるのにアセンブラ使用可になった時点で最早ルールなんてないもんだと思ったが。
|

|