Como usar corretamente as instruções de pré-busca?

Estou tentando vetorizar um loop, computando o produto escalar de um grande vetor de flutuador. Estou computando em paralelo, utilizando o fato de que a CPU possui uma grande quantidade de registros XMM, assim:

__m128* A, B;
__m128 dot0, dot1, dot2, dot3 = _mm_set_ps1(0);
for(size_t i=0; i<1048576;i+=4) {
    dot0 = _mm_add_ps( dot0, _mm_mul_ps( A[i+0], B[i+0]);
    dot1 = _mm_add_ps( dot1, _mm_mul_ps( A[i+1], B[i+1]);
    dot2 = _mm_add_ps( dot2, _mm_mul_ps( A[i+2], B[i+2]);
    dot3 = _mm_add_ps( dot3, _mm_mul_ps( A[i+3], B[i+3]);
}
... // add dots, then shuffle/hadd result.

Ouvi dizer que o uso de instruções de pré-busca pode ajudar a acelerar as coisas, pois pode buscar mais dados "em segundo plano", enquanto faz muls e adiciona dados que estão no cache. No entanto, não consegui encontrar exemplos e explicações sobre como usar _mm_prefetch (), quando, com quais endereços e quais hits. Você poderia ajudar nisso?

questionAnswers(1)

yourAnswerToTheQuestion