「ベクトル化」の版間の差分
表示
削除された内容 追加された内容
編集の要約なし |
|||
16行目: | 16行目: | ||
===単純DOループ=== |
===単純DOループ=== |
||
たとえば以下のようなDOループは1つのベクトル命令に出来る。 |
たとえば以下のようなDOループは1つのベクトル命令に出来る。 |
||
< |
<syntaxhighlight lang="fortran"> |
||
DO 100 I = 1, 100 |
DO 100 I = 1, 100 |
||
A(I) = A(I) * B(I) |
A(I) = A(I) * B(I) |
||
100 CONTINUE |
100 CONTINUE |
||
</syntaxhighlight> |
|||
</source> |
|||
===IF文を含むDOループ=== |
===IF文を含むDOループ=== |
||
以下のような、IF文を含むDOループは、それをサポートするハードウェアがあればベクトル化が可能である。 |
以下のような、IF文を含むDOループは、それをサポートするハードウェアがあればベクトル化が可能である。 |
||
< |
<syntaxhighlight lang="fortran"> |
||
DO 100 I = 1, 100 |
DO 100 I = 1, 100 |
||
IF (A(I) .GT. 0.0) THEN |
IF (A(I) .GT. 0.0) THEN |
||
30行目: | 30行目: | ||
END IF |
END IF |
||
100 CONTINUE |
100 CONTINUE |
||
</syntaxhighlight> |
|||
</source> |
|||
この場合、たとえば[[NEC SX|SXシリーズ]]では、 |
この場合、たとえば[[NEC SX|SXシリーズ]]では、 |
2020年7月5日 (日) 22:38時点における版
ベクトル化(ベクトルか、英: vectorize)
- ベクトル命令化 - コンパイル時にループをベクトル演算命令に変換すること。この項目で説明。
- ベクトル(1次元配列)の演算をサポートするプログラミング環境で、ループをベクトルに書き換えること
- 行列(多次元配列)を同じ要素を持つベクトル(1次元配列)に変換すること→行列の一列化
- 他の形式のデータをベクタ形式データに変換すること
ベクトル化とは、コンピュータのプログラムにおいて、繰り返し処理で配列(ベクトル)の要素をひとつひとつ計算しているような部分を、手動あるいはコンパイラで(自動ベクトル化)、ベクトル計算機で高速に演算できるよう変形すること。近年のSIMD演算のための並列化やスーパースカラ機でのソフトウェアパイプラインに応用できる内容もある。
High Performance Fortranはこれらの高速化を意識したプログラミング言語である。
ベクトル化の手法
以下ではFORTRANのコードを例にとって説明する。基本的に、ループ演算を1つのベクトル演算命令にするので、DOループがベクトル化対象となる。なお、ベクトル命令に出来るパターンは各機種毎、コンパイラ毎に多少異なる。
単純DOループ
たとえば以下のようなDOループは1つのベクトル命令に出来る。
DO 100 I = 1, 100
A(I) = A(I) * B(I)
100 CONTINUE
IF文を含むDOループ
以下のような、IF文を含むDOループは、それをサポートするハードウェアがあればベクトル化が可能である。
DO 100 I = 1, 100
IF (A(I) .GT. 0.0) THEN
A(I) = A(I) * 2.0
END IF
100 CONTINUE
この場合、たとえばSXシリーズでは、
- 配列Aの各要素について、IF文を満たすか満たさないかを判断するマスクベクトルを作成。
- マスクが真の部分だけを演算する、ベクトル命令を生成。
という方法でベクトル化を行なう。
多重ループ
多重ループは、全部まとめて1つのベクトル命令を生成することもある。また、効率化をはかるために、内側のループと外側のループを入れ替える場合もある。これは、ベクトル化を行なうためには、データがメモリ上で連続している必要があるからである。 たとえば、二次元配列を演算する場合、内側のループが連続したメモリをアクセスするようになっていない場合には、演算する順番を入れ替えて(すなわちDOループの内側と外側を入れ替えて)ベクトル化が容易になるようにする。
関連項目
参考文献
- 近藤良三「SXシステムの言語処理系」『NEC技報』第39巻第1号、1986年、NAID 40004407108。