Pregunta

Me pregunto si es posible utilizar SSE (1,2,3,4, ...) para optimizar el siguiente bucle:

// 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;
    }
}

El idioma [j*size + k] se usa para tratar el bloque de la memoria como si se tratara de una matriz multi-dimensional.

Lamentablemente la bandera -ftree-vectorize para GCC (4.5) no cree que el bucle es susceptible de optimización de tipo SIMD. (Aunque diciendo que nunca he visto nada -ftree-vectorize Optimizar pero el más trivial de los bucles.)

Aunque soy consciente de que hay muchas otras maneras de mejorar el rendimiento del bucle (OpenMP, desenrollando, en lugar de algoritmos, etc.) Estoy interesado específicamente para saber si SIMD se puede utilizar. Estoy tal vez más interesado en el esquema general de cómo (si acaso) un bucle de este tipo podría ser transformado, en contraposición a una aplicación concreta.

¿Fue útil?

Solución

Parece que debería ser posible, pero ya que (a) que está utilizando dobles, (b) que está haciendo muy poco en relación con el cálculo de E / S, (c) CPUs x86-64 más modernos tienen dos FPU de todos modos, entonces usted no puede conseguir mucho retorno de su inversión de codificación SIMD.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top