From f574b88adbb81c7262e236f8fb5aa662eb544a27 Mon Sep 17 00:00:00 2001 From: Nadav Rotem Date: Thu, 3 Jan 2013 01:47:02 +0000 Subject: [PATCH] LoopVectorizer: Document the unrolling feature. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171445 91177308-0d34-0410-b5e6-96231b3b80d8 --- docs/Vectorizers.rst | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/docs/Vectorizers.rst b/docs/Vectorizers.rst index 3410f183781..b4c5458953b 100644 --- a/docs/Vectorizers.rst +++ b/docs/Vectorizers.rst @@ -159,8 +159,8 @@ The Loop Vectorizer can vectorize loops that count backwards. Scatter / Gather ^^^^^^^^^^^^^^^^ -The Loop Vectorizer can vectorize code that becomes scatter/gather -memory accesses. +The Loop Vectorizer can vectorize code that becomes a sequence of scalar instructions +that scatter/gathers memory. .. code-block:: c++ @@ -203,6 +203,38 @@ See the table below for a list of these functions. | | | fmuladd | +-----+-----+---------+ + +Partial unrolling during vectorization +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Modern processors feature multiple execution units, and only programs that contain a +high degree of parallelism can fully utilize the entire width of the machine. + +The Loop Vectorizer increases the instruction level parallelism (ILP) by +performing partial-unrolling of loops. + +In the example below the entire array is accumulated into the variable 'sum'. +This is inefficient because only a single 'adder' can be used by the processor. +By unrolling the code the Loop Vectorizer allows two or more execution ports +to be used. + +.. code-block:: c++ + + int foo(int *A, int *B, int n) { + unsigned sum = 0; + for (int i = 0; i < n; ++i) + sum += A[i]; + return sum; + } + +At the moment the unrolling feature is not enabled by default and needs to be enabled +in opt or clang using the following flag: + +.. code-block:: console + + -force-vector-unroll=2 + + Performance -----------