Pergunta

Estou tentando criar uma maneira de fazer o computador fazer algum trabalho para mim. Estou usando o SIMD (SSE2 e SSE3) para calcular o produto cruzado, e eu estava me perguntando se ele poderia ser mais rápido. Atualmente eu tenho o seguinte:

const int maskShuffleCross1 = _MM_SHUFFLE(3,0,2,1); // y z x
const int maskShuffleCross2 = _MM_SHUFFLE(3,1,0,2); // z x y

__m128 QuadCrossProduct(__m128* quadA, __m128* quadB)
{
   // (y * other.z) - (z * other.y)
   // (z * other.x) - (x * other.z)
   // (x * other.y) - (y * other.x)

   return
   (
      _mm_sub_ps
      (
         _mm_mul_ps
         (
            _mm_shuffle_ps(*quadA, *quadA, maskShuffleCross1),
            _mm_shuffle_ps(*quadB, *quadB, maskShuffleCross2)
         ),
         _mm_mul_ps
         (
            _mm_shuffle_ps(*quadA, *quadA, maskShuffleCross2),
            _mm_shuffle_ps(*quadB, *quadB, maskShuffleCross1)
         )
      )
   );
}

Como você pode ver, existem quatro _mm_shuffle_psestá lá, e me perguntei se poderia substituí -los por uma combinação de _mm_unpackhi_ps e _mm_unpacklo_ps que retornam a2 a3 b2 b3 e a0 a1 b0 b1 respectivamente e são um pouco mais rápidos.

Não consegui descobrir no papel, mas pensei em uma solução. E se deixe o computador forçar as etapas necessárias? Apenas entre as diferentes opções e veja o que dá a resposta correta.

Eu consegui trabalhar com multiplicar, ele retorna quando eu quero que ele retorne (3, 12, 27, 0):

startA = _mm_set_ps(1.00, 2.00, 3.00, 0.00);
startB = _mm_set_ps(3.00, 3.00, 3.00, 0.00);
result0 = _mm_mul_ps(startA, startB);
// (3.00, 6.00, 9.00, 0.00)
result1 = _mm_mul_ps(startA, result0);
// (3.00, 12.00, 27.00, 0.00)

Muito bom, se eu disser.

No entanto, quando eu queria implementar a divisão, tropecei em um problema. Multiply não precisa apenas ligar para multiplicar, ele também precisa ligar para a divisão. Ok, então colocamos a divisão acima, multiplique. Mas a divisão não precisa apenas ligar para a divisão, ele também precisa ligar para multiplicar, o que é mais baixo no script, para que ainda não exista.

Comecei com um aplicativo de console vazio no Visual C ++ e coloquei tudo no quadtests.cpp.

Como faço para garantir que essas duas funções possam se chamar?

Desde já, obrigado.

Foi útil?

Solução

Só para confirmar, seu problema é que as funções organizadas como essa não funcionam, porque doStuff não é declarado quando você chama de getFoo:

int getFoo(int bar) {
    doStuff(bar + 1);
}

int doStuff(bar) {
    if (bar == 2) {
        return getFoo(bar);
    }

    return bar * 8;
}

Para consertar isso, você precisa fazer um declaração direta do int doStuff(int). Muitas vezes, isso é feito com um arquivo de cabeçalho - de qualquer maneira, você só precisa adicionar algo assim:

// #includes, etc. go here

int doStuff(int);
int getFoo(int);

// methods follow
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top