AVX: alinhamento de dados: falha na loja, storeu, load, loadu não

Estou modificando a RNNLM como uma rede neural para estudar o modelo de linguagem. No entanto, dado o tamanho do meu corpus, ele está correndo muito devagar. Tentei otimizar a rotina do vetor da matriz * (que é responsável por 63% do tempo total de um pequeno conjunto de dados (eu esperaria que fosse pior em conjuntos maiores)). Agora eu estou preso com intrínsecas.

    for (b=0; b<(to-from)/8; b++) 
    {
        val = _mm256_setzero_ps();
        for (a=from2; a<to2; a++) 
        {
            t1 = _mm256_set1_ps (srcvec.ac[a]);
            t2 = _mm256_load_ps(&(srcmatrix[a+(b*8+from+0)*matrix_width].weight));
            //val =_mm256_fmadd_ps (t1, t2, t3)
            t3 = _mm256_mul_ps(t1,t2);
            val = _mm256_add_ps (val, t3);
        }
        t4 = _mm256_load_ps(&(dest.ac[b*8+from+0]));
        t4 = _mm256_add_ps(t4,val);
        _mm256_store_ps (&(dest.ac[b*8+from+0]), t4);
    }

Este exemplo trava em:

_mm256_store_ps (&(dest.ac[b*8+from+0]), t4);

No entanto, se eu mudar para

_mm256_storeu_ps (&(dest.ac[b*8+from+0]), t4);

(com u para desalinhados, suponho) tudo funciona como pretendido. Minha pergunta é: por quecarga trabalho (embora não deva, se os dados estiverem desalinhados) e o armazenamento não. (além disso, ambos estão operando no mesmo endereço).

dest.ac foram alocados usando

void *_aligned_calloc(size_t nelem, size_t elsize, size_t alignment=64)
{
    size_t max_size = (size_t)-1;

    // Watch out for overflow
    if(elsize == 0 || nelem >= max_size/elsize)
        return NULL;

    size_t size = nelem * elsize;
    void *memory = _mm_malloc(size+64, alignment);
    if(memory != NULL)
        memset(memory, 0, size);
    return memory;
}

e tem pelo menos 50 elementos. (Entre o VS2012, tenho uma instrução ilegal em algumas tarefas aleatórias, então uso o Linux.)

Agradeço antecipadamente, Arkantus.

questionAnswers(1)

yourAnswerToTheQuestion