J'essaye d'optimiser une fonction en utilisant SSE2. Je me demande si je peux mieux préparer les données pour mon code d'assemblage de cette façon. Mes données source sont un ensemble de caractères non signés provenant de pSrcData. Je le copie dans ce tableau de flottants, car mon calcul doit se faire en float.Conversion de chars non signés en float en assembly (pour préparer les calculs vectoriels flottants)
unsigned char *pSrcData = GetSourceDataPointer();
__declspec(align(16)) float vVectX[4];
vVectX[0] = (float)pSrcData[0];
vVectX[1] = (float)pSrcData[2];
vVectX[2] = (float)pSrcData[4];
vVectX[3] = (float)pSrcData[6];
__asm
{
movaps xmm0, [vVectX]
[...] // do some floating point calculations on float vectors using addps, mulps, etc
}
est-il un moyen plus rapide pour moi de jeter tous les octets de pSrcData à un flotteur et le stocker dans vVectX?
Merci!
L'OP ne veut que tous les * autres * 'uint8_t' comme' float'. Avec AVX2, le meilleur est probablement un '__m128i'' _mm_and_si128' et ensuite '_mm256_cvtepu16_epi32'. Ou si vous allez plus tard emballer dans 'uint8_t', peut-être un 256b' and' et décompresser lo/hi (contre zéro) dans la voie pour aller de 16b à 32b éléments entiers avant la conversion en FP. Cela évite tout mélange aléatoire (comme 'vpmovzx ymm'), et évite d'avoir besoin du shuffle inversé pour l'emballage. –
Et oui, vous voudriez le faire à la volée avant quelque chose que vous avez manuellement vectorisé. Les compilateurs peuvent auto-vectoriser des boucles simples de copie + conversion. –
Merci Peter - Je l'ai manqué entièrement – Chris