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.

Était-ce utile?

La solution

Vous avez deux choix:

  1. PAD de chaque ensemble de coefficients sur 16 valeurs pour maintenir l'alignement
  2. Utilisez l'intrinsèque _mm256_loadu_ps pour les accès non alignés
  3. Le premier choix est plus efficace, tandis que la seconde est plus spatiale.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top