LLVM Scalarevolution Pass no puede calcular el recuento de salida para el vectorizador de bucle -- ptimization campo con llvm campo con vectorization campo con llvm-clang campo con auto-vectorization camp Relacionados El problema

LLVM ScalarEvolution Pass Cannot Compute Exit Count for Loop Vectorizer


0
vote

problema

Español

Estoy tratando de averiguar cómo ejecutar el vector de bucle incorporado de LLVM. Tengo un pequeño programa que contiene un bucle extremadamente simple (tuve algo de salida en un punto, por lo que sigue stdio.h todavía se está incluido a pesar de que nunca se use):

    1 #include <stdio.h>   2    3 unsigned NUM_ELS = 10000;   4    5 int main() {   6     int A[NUM_ELS];   7    8 #pragma clang loop vectorize(enable)   9     for (int i = 0; i < NUM_ELS; ++i) {  10         A[i] = i*2;  11     }  12   13     return 0;  14 }   

Como puedes ver, no hace nada útil; Solo necesito que el bucle para ser vectorable. Lo estoy compilando a LLVM BYTECODE CON

  clang -emit-llvm -O0 -c loop1.c -o loop1.bc llvm-dis -f loop1.bc   

Entonces estoy aplicando el vectorizador con

  opt -loop-vectorize -force-vector-width=4 -S -debug loop1.ll   

Sin embargo, la salida de depuración me da esto:

  LV: Checking a loop in "main" from loop1.bc LV: Loop hints: force=? width=4 unroll=0 LV: Found a loop: for.cond LV: SCEV could not compute the loop exit count. LV: Not vectorizing: Cannot prove legality.   

He cavado en la fuente LLVM un poco, y parece que SCEV proviene del Pase de Scalarevolution, que tiene la tarea de (entre otras cosas) contando el número de bordes traseros de vuelta a la condición de bucle, que en Este caso (si no me equivoco) debe ser el conteo de viaje menos el primer viaje (así que 9,999 en este caso). He corrido este pase en un punto de referencia mucho más grande y me da el mismo error en cada bucle, así que supongo que no es el bucle en sí, pero que no le estoy dando suficiente información.

He pasado un poco de tiempo peinando a través de la documentación y los resultados de Google para encontrar un ejemplo de un comando de OPT completo utilizando esta transformación, pero no ha tenido éxito hasta ahora; Agradecería cualquier sugerencia en cuanto a lo que puedo desaparecer (soy nuevo en vectorizar el código para que pueda ser algo muy obvio).

Gracias,

Stephen

Original en ingles

I'm trying to figure out how to run LLVM's built-in loop vectorizer. I have a small program containing an extremely simple loop (I had some output at one point which is why stdio.h is still being included despite never being used):

  1 #include <stdio.h>   2    3 unsigned NUM_ELS = 10000;   4    5 int main() {   6     int A[NUM_ELS];   7    8 #pragma clang loop vectorize(enable)   9     for (int i = 0; i < NUM_ELS; ++i) {  10         A[i] = i*2;  11     }  12   13     return 0;  14 } 

As you can see, it does nothing at all useful; I just need the for loop to be vectorizable. I'm compiling it to LLVM bytecode with

clang -emit-llvm -O0 -c loop1.c -o loop1.bc llvm-dis -f loop1.bc 

Then I'm applying the vectorizer with

opt -loop-vectorize -force-vector-width=4 -S -debug loop1.ll 

However, the debug output gives me this:

LV: Checking a loop in "main" from loop1.bc LV: Loop hints: force=? width=4 unroll=0 LV: Found a loop: for.cond LV: SCEV could not compute the loop exit count. LV: Not vectorizing: Cannot prove legality. 

I've dug around in the LLVM source a bit, and it looks like SCEV comes from the ScalarEvolution pass, which has the task of (among other things) counting the number of back edges back to the loop condition, which in this case (if I'm not mistaken) should be the trip count minus the first trip (so 9,999 in this case). I've run this pass on a much larger benchmark and it gives me the exact same error at every loop, so I'm guessing it isn't the loop itself, but that I'm not giving it enough information.

I've spent quite a bit of time combing through the documentation and Google results to find an example of a full opt command using this transformation, but have been unsuccessful so far; I'd appreciate any hints as to what I may be missing (I'm new to vectorizing code so it could be something very obvious).

Thank you,

Stephen

              

Lista de respuestas

0
 
vote
vote
La mejor respuesta
 

La vectorización depende del número de otra optimización que debe ejecutarse antes. No se ejecutan en absoluto en -O0, por lo tanto, no puede esperar que su código sea 'solo' vectorizado allí.

Agregar -O2 Antes de -loop-vectorize en Opt Cmdline ayudaría aquí (asegúrese de que su matriz 'A' esté externa / usada de alguna manera, de lo contrario, todo se optimizará).

 

vectorization depends on number of other optimization which needs to be run before. They are not run at all at -O0, therefore you cannot expect that your code would be 'just' vectorized there.

Adding -O2 before -loop-vectorize in opt cmdline would help here (make sure your 'A' array is external / used somehow, otherwise everything will be optimized away).

 
 
 
 

Relacionados problema

2  ¿Por qué GCC -O3 Factorial de vector automático? Que muchas instrucciones extra se ven peor  ( Why is gcc o3 auto vectorizing factorial that many extra instructions looks wo ) 
Aquí hay una función factorial muy simple. int factorial(int num) { if (num == 0) return 1; return num*factorial(num-1); } La asamblea ...

1  ¿GCC -FAST habilita la vectorización?  ( Does gcc ofast enable vectorization ) 
Actualmente estoy compilando SPEC2000 ART BENCHMARK usando las siguientes 2 configuraciones de bandera: <?php use IlluminateSupportFacadesSchema; use...

1  ¿Es un tipo [I] + = a [I + 1] de dependencia de datos en un bucle? ¿Puede ser vectorizado?  ( Is ai ai1 kind of data dependency in a loop can it be vectorized ) 
En lo que aozco, un bucle que tiene dependencias de datos en serie, como A[i] += A[i-1] no se puede vector. Pero no estoy seguro de que A[i] += A[i+1] e...

0  ¿Cómo empacar las operaciones booleanas utilizando GCC u otros compiladores?  ( How to pack boolean operations using gcc or other compilers ) 
Intel CPUS son capaces de realizando 512 o 1024 operaciones de bits usando operaciones vectorizadas. Supongamos que tengo un fragmento de código que se pare...

0  Salida de SSE raros  ( Weird sse output ) 
De las últimas una semana, estoy trabajando en la instrucción de SSE y la vectorización automática. Estoy teniendo código escrito en C que contiene bucles de ...

2  GCC Auto Vectorización  ( Gcc auto vectorization ) 
En el compilador de GCC ¿Hay alguna manera de habilitar solo la vectorización automática? Sé que -ftree-vectorize bandera habilita la vectorización automáti...

1  GCC 4.8.2 Fallo de vector automático debido al cout  ( Gcc 4 8 2 auto vectorization fail due to cout ) 
Mi código es el siguiente y uso GCC 4.8.2: #include <iostream> #include <stdint.h> #include <sys/time.h> #include <ctime> using namespace std; int main(i...

4  ¿Cómo puede obtener GCC para vectorizar completamente este bucle SQRT?  ( How can you get gcc to fully vectorize this sqrt loop ) 
Si tomo este código ast0 y compile con ast1 , luego obtino instrucciones como esta en el bucle ( compilador -Explorer ) ast2 XMMS son registros d...

3  Requisitos de vector de auto-vector de C ++ para GCC, Clang y MSVC  ( C auto vectorization requirements for gcc clang and msvc ) 
¿Son correctas las siguientes afirmaciones? con GCC y CLANG, mi código se contemplará automáticamente si compile con: -O2 -ftree-vectorize -march=XYZ ...

1  Auto-vectorización de "es cualquiera de estos caracteres en cadena"  ( Auto vectorization of is any of these characters in string ) 
Comprobación Si los caracteres están en una cadena deben ser bastante simples de acelerar el uso de SIMD. Esperaba que la autoportización moderna me daría la ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos