Pregunta

Al tratar de averiguar si es o no bucle interno de mi código está golpeando una barrera diseño de hardware o una falta de comprensión de mi parte barrera. Hay un poco más a él, pero la pregunta más simple que puedo llegar a responder es la siguiente:

Si tengo el siguiente código:

float px[32768],py[32768],pz[32768];
float xref, yref, zref, deltax, deltay, deltaz;

initialize_with_random(px);
initialize_with_random(py);
initialize_with_random(pz);

for(i=0;i<32768-1;i++) {
  xref=px[i];
  yref=py[i];
  zref=pz[i];
  for(j=0;j<32768-1;j++ {
    deltx=xref-px[j];
    delty=yref-py[j];
    deltz=zref-pz[j];
  } }

¿Qué tipo de máxima velocidad teórica de hasta iba a ser capaz de ver yendo a las instrucciones SSE en una situación en la que tengo un control completo sobre el código (montaje, intrínsecos, lo que sea), pero no tiene control sobre el entorno de ejecución que no sea la arquitectura (es decir, que es un entorno multi-usuario, de modo que no puede hacer nada acerca de cómo el núcleo del sistema operativo asigna tiempo a mi proceso en particular).

En este momento estoy viendo una velocidad de hasta 3 veces con mi código, cuando yo habría pensado que el uso de SSE me daría mucha más profundidad de vectores que la velocidad 3x arriba se indica (presumiblemente la velocidad 3x hasta me dice que tengo una 4x máximo rendimiento teórico). (He tratado de cosas tales como dejar deltx / delty / deltz ser matrices en caso de que el compilador no era lo suficientemente inteligente como para promover la auto-ellos, pero todavía ver sólo 3x velocidad.) Estoy usando el compilador Intel C con las banderas apropiadas para la vectorización del compilador, pero no intrínsecos obviamente.

¿Fue útil?

Solución

Depende de la CPU. Sin embargo, el máximo teórico no obtendrá más de 4x. No sé de una CPU que puede ejecutar más de una instrucción SSE por ciclo de reloj, lo que significa que puede como máximo de cómputo 4 valores por ciclo.

La mayor parte de la CPU puede hacer al menos una flota de instrucciones escalares punto por ciclo, por lo que en este caso se vería un máximo teórico de un aumento de velocidad 4x.

Sin embargo, usted tiene que buscar el rendimiento de instrucción específica para la CPU se está ejecutando en.

Un aumento de velocidad práctica de 3x es bastante bueno.

Otros consejos

Creo que probablemente tendría que intercalar el bucle interno de alguna manera. El vector de 3 componentes se está cumpliendo a la vez, pero eso es sólo 3 operaciones a la vez. Para llegar a 4, que haría 3 componentes desde el primer vector, y 1 de la siguiente, a continuación, 2 y 2, y así sucesivamente. Si estableció una especie de cola que se carga y procesa los datos de 4 componentes a la vez, y luego separarlo después, que podría funcionar.

Editar: Se podría desenrollar el bucle interior para hacer 4 vectores por iteración (suponiendo que el tamaño de la matriz es siempre un múltiplo de 4). Eso sería lograr lo que he dicho anteriormente.

Considere lo siguiente: ¿Qué tan ancha es un flotador? ¿Qué tan ancha es la instrucción SSEX? La relación debe debe darle algún tipo de razonable límite superior.

Es también digno de mención que fuera de orden tuberías juegan Havok con conseguir una buena estimación del aumento de velocidad.

Debe tener en cuenta loop tiling - la forma en que está accediendo a los valores en el bucle interno es probablemente causando una gran cantidad de golear en la caché de datos L1. No es demasiado malo, porque todo lo que probablemente todavía cabe en la L2 a 384 KB, pero no es fácilmente un orden de magnitud de diferencia entre un acierto de caché L1 y una caché de golpe L2, así que esto podría hacer una gran diferencia para usted.

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