Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

404
Visualizações
Extensión del vector GCC C: ¿Cómo probar el resultado de una comparación (para asignación condicional, etc.)?

Antecedentes: las extensiones vectoriales integradas de GCC C permiten una representación bastante natural de los vectores SIMD como "tipos" de C. Según la documentación, se admiten muchas operaciones integradas (+, -, etc.). Sin embargo, el operador ternario, así como los operadores lógicos (&&, ||) por alguna razón solo funcionan en C++. Este es un problema para una base de código all=C.

La pregunta: en GCC C, ¿cómo se implementarían condicionales compatibles con SIMD [sin sucursales] de la forma:

 v4si a = {2,-1,3,4}, b, indicesLessThan0; indicesLessThan0 = a < 0; b = indicesLessThan0 ? a : 0;

Y, de manera más general, cómo realizar un bloque independiente arbitrario de declaraciones basadas en ese mismo resultado:

 v4si c = {9,8,7,6}, d; for (int i = 0; i < 4; i++) { if (indicesLessThan0[i]) { // consider tests one by one b[i] = a[i] // as the ternary operator does above d[i] = c[i] + 1; // some other independent operation } else { b[i] = 0; // as the ternary operator does above d[i] = c[i] - 1; // another independent operation } }

Si hacer un bloque de declaraciones es más difícil (la bifurcación SIMD es mala), estaría bien realizar la prueba ternaria nuevamente para cualquier declaración adicional a costa (supuestamente) de cierta eficiencia:

 d = indicesLessThan0 ? c + 1 : c - 1; // the other operation in the loop

Pero el operador ternario no funciona en C por alguna razón que el manual no explica. ¿Hay otra manera fácil? ¿Alguna forma de usar declaraciones if?

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

He encontrado 3 soluciones como resultado de presionar el código con el fregadero de la cocina.

  1. Cambiar a g ++. No es demasiado difícil, y resulta que la mayor parte del código se puede intercambiar simplemente poniendo un (escriba *) antes de todas las asignaciones. Entonces solo puedo hacer:

    v16s8 condStor = test ? a : b;

  2. Aún mejor, descubrí que puedes usar bitbash usando varias combinaciones de &'s y |'s, de la misma manera que todos lo hacen con bits dentro de números enteros. El truco es que los vectores establecen toda la verdad en 11111111... (-1 sin signo), lo que hace que los valores se mantengan cuando se usan operadores bit a bit.

  3. Aún mejor, "escriba el juego de palabras 101" con una función intrínseca:
    v16s8 condStor = b; __builtin_ia32_maskmovdqu (a, test, (char *)(&condStor));
    Esto aprovecha la función dedicada a hacer lo que hace el #2 de una sola vez.

¿No convencido? Compruebe el montaje:

  1.  pxor %xmm1, %xmm1 movdqa -64(%rbp), %xmm0 pcmpeqb %xmm1, %xmm0 pcmpeqd %xmm1, %xmm1 pandn %xmm1, %xmm0 pxor %xmm1, %xmm1 pcmpgtb %xmm0, %xmm1 movdqa %xmm1, %xmm0 movdqa -32(%rbp), %xmm2 movdqa -16(%rbp), %xmm1 pand %xmm0, %xmm1 pandn %xmm2, %xmm0 por %xmm1, %xmm0 movaps %xmm0, -80(%rbp)
  2.  movdqa -64(%rbp), %xmm0 movdqa %xmm0, %xmm1 pand -16(%rbp), %xmm1 pcmpeqd %xmm0, %xmm0 pxor -64(%rbp), %xmm0 pand -32(%rbp), %xmm0 por %xmm1, %xmm0 movaps %xmm0, -80(%rbp)
  3.  movdqa -32(%rbp), %xmm0 movaps %xmm0, -80(%rbp) leaq -80(%rbp), %rax movdqa -16(%rbp), %xmm0 movdqa -64(%rbp), %xmm1 movq %rax, %rdi maskmovdqu %xmm1, %xmm0

    A juzgar por lo intrincado que parece ser 1, seguido de 2, seguido de 3, ahora veo el costo de la abstracción de C++. Tal vez esto es lo que Linus estaba despotricando en el pasado. (No, probablemente no). De todos modos, ¡espero que esto ayude a alguien!

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda