Pregunta

Estoy usando extensiones SSE disponibles en el procesador Core 2 Duo (compilador gcc 4.4.1). Veo que hay 16 registros disponibles cada uno de los cuales es de 128 bits de longitud. Ahora, con capacidad para 4 valores enteros en un solo registro, y 4 en otro registro y el uso de los intrínsecos puedo añadirlos en una instrucción. La ventaja obvia es de esta manera que sólo requieren 1 instrucción en lugar de 4.

Mi pregunta es "es que todo por SIMD?". Deje que tengo A1, A2, A3, A4, A5, A6, A7, A8 y B1, B2, B3, B4, B5, B6, B7, B8. Let A1, A2 son registros vectoriales. Ahora, A1 <<< (a1, a2, a3, a4) y B1 <<< (b1, b2, b3, b4) y add (A1, B1) llevará a cabo la adición vectorial.

Let A2 <<< (a5, a6, a7, a8), B2 <<< (b5, b6, b7, b8). ¿Hay una instrucción de suma que puede hacer para sumar (A1, B1) y añadir (A2, B2) al mismo tiempo.

¿Cuántas vector de unidades funcionales están disponibles en Core2Duo y donde puedo conseguir estas informaciones?

cualquier otra fuente de información relacionados con estos es muy apreciada.

¿Fue útil?

Solución

  • No, no hay ninguna sola instrucción SSE a hacer eso. Necesita ejecutar dos instrucciones. ¿Está pensando en algo así como las instrucciones de cadena 86 y el prefijo REP? No hay SSE equivalente.

  • Las dos operaciones de 4 de ancho vector se ejecutará concerrently en el sentido de que todos los procesadores modernos son altamente pipeline. La segunda instrucción pasará a la tubería de 1 sólo ciclo detrás del primero (suponiendo que los dos no son interdependientes, que es el caso en su ejemplo), por lo que su ejecución se superponen en el tiempo, a excepción de que un ciclo.

  • Cada core de su procesador multi-núcleo tiene su propia unidad funcional del vector. Tienes que escribir código multiproceso para tomar ventaja de esto.

  • Algunas CPUs tienen 1 vector unitario por núcleo, algunos tienen sólo 1/2! En el último caso, la unidad de vector es sólo 64 bits de ancho y sólo se ejecuta una mitad de la instrucción SSE a la vez. Se obtiene lo que se paga.

  • Usted debe mirar en AVX, la nueva instrucción extensión set que evoluciona SSE para apoyar unidades de vectores más amplios.

  • O usted podría mirar en la programación del vector real en un GPU con OpenCL o CUDA.

Otros consejos

No creo que haya una sola instrucción de hacer esto (a menos que se colaron uno en una versión reciente de SSE).

Sin embargo, ya que las operaciones que se está haciendo son independientes, el compilador puede emitir la segunda instrucción de suma antes de los primeros acabados uno. Por lo que la línea de tiempo sería algo como

begin C1 = A1 + B1
begin C2 = A2 + B2
wait
end C1 = A1 + B1
end C2 = A2 + B2

Así que aunque usted esté usando dos instrucciones, estás no necesariamente tomar el doble de tiempo. La duración real de la espera dependerá del procesador y la latencia de la instrucción particular que se está usando.

Aquí hay una explicación más detallada de la canalización: http://en.wikipedia.org/wiki/Instruction_pipeline

Para obtener ayuda en la programación SIMD en general, de Apple página SSE es bastante bueno. Es algo dirigido a las personas que migran aplicaciones de PowerPC a SSE, pero hay una buena información general, allí también.

El sitio de Intel contiene toda la información que usted necesitará siempre!

http://www.intel.com/products/processor/manuals/

Editar en respuesta al comentario: Toda la información se encuentra en los enlaces vinculados al anterior pero No. Se puede empacar 8 enteros de 16 bits en 1 registro y por lo tanto realizar 8 simultánea añade, pero no SSE no permite la adición de 2 registros simultáneamente.

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