コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「ループ分割とループ融合」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
m format
Cewbot (会話 | 投稿記録)
m Bot作業依頼: sourceタグをsyntaxhighlightタグに置換 (Category:非推奨のsourceタグを使用しているページ) - log
6行目: 6行目:


=== C言語での例 ===
=== C言語での例 ===
<source lang="c">
<syntaxhighlight lang="c">
int i, a[100], b[100];
int i, a[100], b[100];
for (i = 0; i < 100; i++) {
for (i = 0; i < 100; i++) {
12行目: 12行目:
b[i] = 2;
b[i] = 2;
}
}
</syntaxhighlight>
</source>
上記のコードは、以下のコードと等価である。
上記のコードは、以下のコードと等価である。
<source lang="c">
<syntaxhighlight lang="c">
int i, a[100], b[100];
int i, a[100], b[100];
for (i = 0; i < 100; i++) {
for (i = 0; i < 100; i++) {
22行目: 22行目:
b[i] = 2;
b[i] = 2;
}
}
</syntaxhighlight>
</source>


== loop fusion ==
== loop fusion ==


=== C言語での例 ===
=== C言語での例 ===
<source lang="c">
<syntaxhighlight lang="c">
int i, a[100], b[100];
int i, a[100], b[100];
for (i = 0; i < 100; i++) {
for (i = 0; i < 100; i++) {
35行目: 35行目:
b[i] = 2;
b[i] = 2;
}
}
</syntaxhighlight>
</source>
上記のコードは、以下のコードと等価である。
上記のコードは、以下のコードと等価である。
<source lang="c">
<syntaxhighlight lang="c">
int i, a[100], b[100];
int i, a[100], b[100];
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
44行目: 44行目:
b[i] = 2;
b[i] = 2;
}
}
</syntaxhighlight>
</source>


== 関連項目 ==
== 関連項目 ==

2020年7月5日 (日) 23:10時点における版

コンピュータ科学の分野において、loop fission(またはloop distribution)は、コンパイラ最適化手法の1つであり、1つのループを、同じインデックスの範囲を持つ複数のループに分解し、各ループでは元のループ本体の一部だけをもたせる、という手法である[1]。大きなループ本体を小さなループに分割することで、参照の局所性をよりよく活用することが目的である。この最適化が最も効率よく実行できるのは、1つのタスクを複数のタスクに分割して、各タスクをそれぞれのコアで並列に実行できるマルチコアプロセッサである。

逆に、loop fusion(またはloop jamming)は、複数のループを1つのループに置換するという、コンパイラ最適化およびループ変換英語版の手法である。2つのループが同じ範囲でイテレートしており、互いにデータの参照が存在しない場合に適用可能である。loop fusionは、必ずしもランタイムの速度向上に寄与するとは限らない。実際、一部のアーキテクチャでは、たとえば、各ループ内でのデータの局所性が高まるため、2つのループの方が1つのループより性能が良いことがある。

loop fission

C言語での例

 int i, a[100], b[100];
 for (i = 0; i < 100; i++) {
   a[i] = 1; 
   b[i] = 2;
 }

上記のコードは、以下のコードと等価である。

 int i, a[100], b[100];
 for (i = 0; i < 100; i++) {
   a[i] = 1;                     
 }
 for (i = 0; i < 100; i++) {
   b[i] = 2;
 }

loop fusion

C言語での例

  int i, a[100], b[100];
  for (i = 0; i < 100; i++) {
    a[i] = 1;
  }
  for (i = 0; i < 100; i++) {
    b[i] = 2;
  }

上記のコードは、以下のコードと等価である。

  int i, a[100], b[100];
  for (i = 0; i < 100; i++)
  {
    a[i] = 1; 
    b[i] = 2;
  }

関連項目

参考文献

  1. ^ Kennedy, Ken; Allen, Randy. (2001). Optimizing Compilers for Modern Architectures: A Dependence-based Approach. Morgan Kaufmann. ISBN 1-55860-286-0