Otimizando diferenças finitas com SSE
-
26-09-2019 - |
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.
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.