Pregunta

Estoy trabajando en un poco de código y estoy tratando de optimizar tanto como sea posible, básicamente hacerlo funcionar bajo un cierto límite de tiempo.

A continuación se realiza la llamada ...

static affinity_partitioner ap;
parallel_for(blocked_range<size_t>(0, T), LoopBody(score), ap);

... y el siguiente es lo que se ejecuta.

void operator()(const blocked_range<size_t> &r) const {

    int temp;
    int i;
    int j;
    size_t k;
    size_t begin = r.begin();
    size_t end = r.end();

    for(k = begin; k != end; ++k) { // for each trainee
        temp = 0;
        for(i = 0; i < N; ++i) { // for each sample
            int trr = trRating[k][i];
            int ei = E[i];              
            for(j = 0; j < ei; ++j) { // for each expert
                temp += delta(i, trr, exRating[j][i]);
            }
        }           
        myscore[k] = temp;
    }
}

Estoy usando TBB de Intel para optimizar este. Pero también he estado leyendo sobre SIMD y SSE2 y las cosas a lo largo de esa naturaleza. Así que mi pregunta es, ¿Cómo almacenar las variables (i, j, k) en los registros de modo que se puede acceder más rápido por la CPU? Creo que la respuesta tiene que ver con la implementación de SSE2 o alguna variación de ella, pero no tengo ni idea de cómo hacerlo. Algunas ideas?

Edit: Esto se llevará a cabo en una máquina Linux, pero usando el compilador de Intel creo. Si ayuda, tengo que ejecutar los siguientes comandos antes de hacer cualquier cosa para asegurarse de que el compilador obras ... fuente /opt/intel/Compiler/11.1/064/bin/intel64/iccvars_intel64.csh; /opt/intel/tbb/2.2/bin/intel64/tbbvars.csh fuente ... y luego para compilar hago: ICC -ltbb test.cxx -o de prueba

Si no hay manera fácil de implementar SSE2, algún consejo sobre cómo optimizar aún más el código?

Gracias, Hristo

¿Fue útil?

Solución

Su duda representa una cierta confusión sobre lo que está pasando. Las i, j, k variables se llevan a cabo casi con toda seguridad en los registros ya, suponiendo que se compila con optimizaciones en (que debe hacer - add "O2" a su invocación CPI).

Se puede usar un bloque asm, pero un método más fácil teniendo en cuenta que ya está usando CPI es utilizar las características intrínsecas de la ESS. documentación de Intel para ellos es aquí - http: // www .intel.com / software / productos / compiladores / clin / docs / ug_cpp / comm1019.htm

Parece que se puede SIMD-ize el bucle de nivel superior, a pesar de que va a depender en gran medida de lo que su función es delta.

Otros consejos

Cuando se desea utilizar lenguaje ensamblador dentro de un módulo C ++, puede simplemente ponerlo dentro de un bloque de asm, y seguir utilizando sus nombres de variables desde fuera del bloque. Las instrucciones de montaje que utiliza dentro del bloque asm especificarán qué registrarse, etc se va a operar, pero variarán según la plataforma.

Si está utilizando GCC, consulte http: //gcc.gnu .org / proyectos / árbol-ssa / vectorization.html de cómo ayudar al compilador de auto-vectorizar su código y ejemplos.

En caso contrario, es necesario dejar que nosotros sabemos qué plataforma que está utilizando.

El compilador debería estar haciendo esto para usted. Por ejemplo, en VC ++ sólo tiene que activar el SSE2.

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