Pergunta

Gostaria de saber se é possível usar o SSE (1,2,3,4, ...) para otimizar o seguinte loop:

// u and v are allocated through new double[size*size]
for (int j = l; j < size-1; ++j)
{
    for (int k = 1; k < size-1; ++k)
    {
        v[j*size + k] = (u[j*size + k-1] + u[j*size + k+1] 
                       + u[(j-1)*size + k]+ u[(j+1)*size + k]) / 4.0;
    }
}

o [j*size + k] O idioma é usado para tratar o bloco de memória como se fosse uma matriz multidimensional.

Infelizmente o -ftree-vectorize O sinalizador para GCC (4.5) não acredita que o loop seja passível de otimização do tipo SIMD. (Apesar de dizer que nunca vi -ftree-vectorize otimize qualquer coisa, exceto o mais trivial dos loops.)

Embora esteja ciente de que existem muitas outras maneiras de melhorar o desempenho do loop (OpenMP, algoritmos de desenrolar, no local, etc.), estou especificamente interessado em saber se o SIMD pode ser usado. Talvez eu esteja mais interessado no esboço geral de como (se é que existe), esse loop poderia ser transformado, em oposição a uma implementação concreta.

Foi útil?

Solução

Parece que deve ser possível, mas como (a) você está usando duplas, (b) você está fazendo muito pouco computação em relação à E/S, (c) as CPUs X86-64 mais modernas têm duas FPUs de qualquer maneira, então Você pode não obter muito retorno do seu investimento de codificação SIMD.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top