AVX alignement en tableau
-
21-12-2019 - |
Question
J'utilise MSVC12 (Visual Studio 2013 Express) et j'essaie d'impliquer une multiplication rapide de 8 * 8 Valeurs de flottaisons.Le problème est l'alignement: le vecteur a réellement 9 * N valeurs, mais j'ai toujours besoin de la première des 8 premiers, alors par exemple.Pour n= 0, l'alignement de 32 octets est garanti (lorsque j'utilise _mm_malloc), pour n= 1 la "première" valeur est alignée à 4 * 9= 36 octets.
for(unsigned i = 0; i < n; i++) {
float *coeff_set = (float *)_mm_malloc(909 * 100 *sizeof(float), 32);
// this works for n=0, not n=1, n=2, ...
__m256 coefficients = _mm256_load_ps(&coeff_set[9 * i]);
__m256 result = _mm256_mul_ps(coefficients, coefficients);
...
}
Y a-t-il une possibilité de résoudre ce problème?Je voudrais garder la structure de mes données, mais si possible, je le changerais.Une solution que j'ai trouvée était de copier les 8 flotteurs d'abord dans une matrice alignée, puis chargez-la, mais la perte de performance est trop élevée que.
La solution
Vous avez deux choix:
- PAD de chaque ensemble de coefficients sur 16 valeurs pour maintenir l'alignement
- Utilisez l'intrinsèque
_mm256_loadu_ps
pour les accès non alignés
Le premier choix est plus efficace, tandis que la seconde est plus spatiale.