- SSEによる単精度の数値積分の高速化(改良版)
-
yosirin-hello / yosi-s@galaxy.ocn.ne.jp
注 : 本文はまだ完成したものではありません.
文章・図が変更される可能性があります. ご了承下さい.
| 1. はじめに |
|
| へるみさんのアドバイスで最終的に数値積分は, C言語でコンパイラの最適化をオンにして比較しても,
SSEを使った方が約15倍高速に動作するようになりました. こんなにも高速化するなんて,
思ってもいなかったので私自身も驚いています. それでは, どのように改良し, 高速化したのか解説していくことにしましょう. |
|
| 2. 改良した点 |
|
まず, 一番大きな改良がされた部分を説明します. Fig1.
を見ると, 従来のアプローチは非常に無駄が多かったことがわかります. 私は,
なぜかループ毎に合計の計算をしなければならないと思い込んでいました.
しかし, へるみさんの指摘により, ループ毎に合計の計算をする必要がないことに気がつきました.
![]() この合計計算をループ終了後に行うことで, 積分計算の効率が大幅に向上することができました. この他に改良した点は以下の通りです. ・SSEのCVTI2SS命令とSHUFPS命令を組み合わせて, XMMレジスタにdiv_countをfloat型に変換してブロードキャストするようにしました ・i Generatorとx Generatorを統合し, ループ中のコードをコンパクトにしました ・ループカウンタ(ECX)をループ毎にデクリメントする方法で使用し, CMP命令を取り除きました Fig2. に, 以前のフローチャートと改良したもののフローチャートの比較を示します.
|
|
研究中です. しばらくお待ちください.
Copyright © 2002 yosirin-hello All rights
reserved.