Loop interchange (original) (raw)
In compiler theory, loop interchange is the process of exchanging the order of two iteration variables used by a nested loop. The variable used in the inner loop switches to the outer loop, and vice versa. It is often done to ensure that the elements of a multi-dimensional array are accessed in the order in which they are present in memory, improving locality of reference. For example, in the code fragment: for i from 0 to 10 for j from 0 to 20 a[i,j] = i + j loop interchange would result in: for j from 0 to 20 for i from 0 to 10 a[i,j] = i + j
Property | Value |
---|---|
dbo:abstract | In compiler theory, loop interchange is the process of exchanging the order of two iteration variables used by a nested loop. The variable used in the inner loop switches to the outer loop, and vice versa. It is often done to ensure that the elements of a multi-dimensional array are accessed in the order in which they are present in memory, improving locality of reference. For example, in the code fragment: for i from 0 to 10 for j from 0 to 20 a[i,j] = i + j loop interchange would result in: for j from 0 to 20 for i from 0 to 10 a[i,j] = i + j On occasion, such a transformation may create opportunities to further optimize, such as automatic vectorization of the array assignments. (en) Перестановка циклов (англ. Loop interchange) — оптимизация компилятора при которой меняется порядок итерационных переменных, относящихся к группе вложенных циклов. Итерационная переменная, используемая во внутреннем цикле, перемещается во внешний цикл, и наоборот. Это часто делается, чтобы гарантировать, что элементы многомерных массивов доступны в том порядке, в котором они хранятся в памяти, т.е. для улучшения локальности ссылок. Например, следующий код: for (int j=0; j<10; j++){ for (int i=0; i<20; i++) { y[i][j] = i + j; }} в результате применения оптимизации может быть преобразован в: for (int i=0; i<20; i++){ for (int j=0; j<10; j++) { y[i][j] = i + j; }} В отдельных случаях, такое преобразование может создать контекст для дальнейших оптимизаций, например для векторизации. В то же время, как и любая другая оптимизация компилятора, данная оптимизация может привести к ухудшению производительности. Рассмотрим следующий пример: for (int i=0; i<10; i++){ for (int j=0; j<20; j++) { a[i] = a[i] + b[j][i] * c[i] }} Применение оптимизации в данном случае может улучшить производительность доступа к b[j][i], однако появятся повторные чтения a[i] и c[i] во внутреннем цикле в течение каждой итерации. В результате, эффективность работы может ухудшиться. (ru) |
dbo:thumbnail | wiki-commons:Special:FilePath/Row_and_column_major_order.svg?width=300 |
dbo:wikiPageID | 1837923 (xsd:integer) |
dbo:wikiPageLength | 4104 (xsd:nonNegativeInteger) |
dbo:wikiPageRevisionID | 1052687857 (xsd:integer) |
dbo:wikiPageWikiLink | dbr:Morgan_Kaufmann_Publishers dbr:Dependence_analysis dbc:Articles_with_example_code dbr:Elsevier dbr:Compiler_theory dbr:CPU_Cache dbr:CPU_cache dbr:C_(programming_language) dbc:Compiler_optimizations dbr:Locality_of_reference dbr:FORTRAN dbr:Array_data_structure dbr:Academic_Press dbr:Automatic_vectorization dbr:Optimizing_compiler dbr:Loop_fission_and_fusion dbr:Loop_splitting dbr:Loop_unrolling dbr:Loop_(computing) dbr:Row-major_order dbr:Compiler_optimization dbr:Loop_skewing dbr:File:Row_and_column_major_order.svg |
dbp:wikiPageUsesTemplate | dbt:Cite_book dbt:Reflist dbt:Compiler_optimizations |
dct:subject | dbc:Articles_with_example_code dbc:Compiler_optimizations |
rdf:type | yago:WikicatCompilerOptimizations yago:Abstraction100002137 yago:Act100030358 yago:Action100037396 yago:Change100191142 yago:ChangeOfState100199130 yago:Event100029378 yago:Improvement100248977 yago:Optimization100260051 yago:PsychologicalFeature100023100 yago:YagoPermanentlyLocatedEntity |
rdfs:comment | In compiler theory, loop interchange is the process of exchanging the order of two iteration variables used by a nested loop. The variable used in the inner loop switches to the outer loop, and vice versa. It is often done to ensure that the elements of a multi-dimensional array are accessed in the order in which they are present in memory, improving locality of reference. For example, in the code fragment: for i from 0 to 10 for j from 0 to 20 a[i,j] = i + j loop interchange would result in: for j from 0 to 20 for i from 0 to 10 a[i,j] = i + j (en) Перестановка циклов (англ. Loop interchange) — оптимизация компилятора при которой меняется порядок итерационных переменных, относящихся к группе вложенных циклов. Итерационная переменная, используемая во внутреннем цикле, перемещается во внешний цикл, и наоборот. Это часто делается, чтобы гарантировать, что элементы многомерных массивов доступны в том порядке, в котором они хранятся в памяти, т.е. для улучшения локальности ссылок. Например, следующий код: for (int j=0; j<10; j++){ for (int i=0; i<20; i++) { y[i][j] = i + j; }} в результате применения оптимизации может быть преобразован в: (ru) |
rdfs:label | Loop interchange (en) Перестановка циклов (ru) |
owl:sameAs | freebase:Loop interchange yago-res:Loop interchange wikidata:Loop interchange dbpedia-ru:Loop interchange https://global.dbpedia.org/id/4r4D9 |
prov:wasDerivedFrom | wikipedia-en:Loop_interchange?oldid=1052687857&ns=0 |
foaf:depiction | wiki-commons:Special:FilePath/Row_and_column_major_order.svg |
foaf:isPrimaryTopicOf | wikipedia-en:Loop_interchange |
is dbo:wikiPageWikiLink of | dbr:Enabling_transformation dbr:Normalized_loop dbr:Intel_Fortran_Compiler dbr:Optimizing_compiler dbr:Loop_dependence_analysis dbr:Loop_nest_optimization dbr:Loop_optimization |
is foaf:primaryTopic of | wikipedia-en:Loop_interchange |