Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

293
Vistas
_mm256_slli_si256: error "el último argumento debe ser un intermedio de 8 bits"

Tengo el siguiente problema (g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4):

Cuando uso _mm256_slli_si256() directamente, como:

 __m256i x = _mm256_set1_epi8(0xff); x = _mm256_slli_si256(x, 3);

el código compila sin problema ( g++ -Wall -march=native -O3 -o shifttest shifttest.C ).

Sin embargo, si lo envuelvo en una función

 __m256i doit(__m256i x, const int imm) { return _mm256_slli_si256(x, imm); }

el compilador se queja de que

 /usr/lib/gcc/x86_64-linux-gnu/4.8/include/avx2intrin.h: In function '__m256i doit(__m256i, int)': /usr/lib/gcc/x86_64-linux-gnu/4.8/include/avx2intrin.h:651:58: error: the last argument must be an 8-bit immediate return (__m256i)__builtin_ia32_pslldqi256 (__A, __N * 8);

independientemente de si la función se utiliza o no.

Esto no puede ser un problema con el operando inmediato, ya que la función doit() compila si uso, por ejemplo _mm256_slli_si32(x, imm) en su lugar, y _mm256_slli_si32() también requiere un operando inmediato.

Hay un informe de error relacionado en

https://gcc.gnu.org/bugzilla/show_bug.cgi?format=multiple&id=54825

pero es bastante antiguo (2012) y se relaciona con gcc 4.8.0, por lo que pensé que el parche ya se habría incorporado a g ++ 4.8.4.

¿Hay alguna solución alternativa a este problema?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

El argumento que indica el número de bits a desplazar debe ser una constante de tiempo de compilación, ya que se codifica como un valor inmediato en la instrucción (es decir, no se carga desde un registro; el valor de desplazamiento real forma parte de la codificación de la instrucción). Siempre y cuando lo uses directamente, así:

 __m256i x = _mm256_set1_epi8(0xff); x = _mm256_slli_si256(x, 3);

luego, el compilador ve el valor de cambio como una constante de tiempo de compilación, 3. Sin embargo, cuando está en el contexto de su función de ajuste:

 __m256i doit(__m256i x, const int imm) { return _mm256_slli_si256(x, imm); }

el compilador no tiene forma de inferir el valor de imm en el momento de la compilación, que es necesario para sintetizar la instrucción shift. El hecho de que imm sea un const int no significa que su valor se conozca en tiempo de compilación, solo que la semántica del lenguaje no permite modificarlo dentro del alcance de la función doit() .

Es posible que si el compilador introdujera doit() , entonces podría determinar estáticamente el valor de imm y, por lo tanto, compilar con éxito, pero eso podría ser ir demasiado lejos.

Si está utilizando C++, otra opción sería hacer de doit() una plantilla de función con un argumento que indique el tamaño del cambio, como este:

 template <int Shift> __m256i doit(__m256i x) { return _mm256_slli_si256(x, Shift); }
over 4 years ago · Santiago Trujillo Denunciar

0

El problema se debe a que su función es pública (es decir, puede ser llamada por funciones en otros módulos de C/C++). Si lo declara como static (o inline ), el compilador no generará código para esta función y no obtendrá un error.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda