Pregunta

Estoy trabajando en Visual Studio 2008 y en la configuración del proyecto que veo la opción para "activar conjunto de instrucciones extendido", que puedo en Ninguno, SSE o SSE2

Así que el compilador tratará de instrucciones por lotes juntos con el fin de hacer uso de las instrucciones SIMD?

¿Hay alguna regla uno puede seguir en la manera de optimizar el código de tal manera que el compilador puede hacer ensamblador effiecient el uso de estas extensiones?

Por ejemplo actualmente estoy trabajando en un trazador de rayos. Un shader toma alguna entrada y calcula a partir de la entrada de un color de salida, como este:

PixelData data = RayTracer::gatherPixelData(pixel.x, pixel.y);
Color col = shadePixel(data);

¿verdad, por ejemplo, ser beneficioso para escribir el shadercode de tal manera que lo haría sombra 4 píxeles diferentes dentro de una llamada instrucción? algo como esto:

PixelData data1 = RayTracer::gatherPixelData(pixel1.x, pixel1.y);
...
shadePixels(data1, data2, data3, data4, &col1out, &col2out, &col3out, &col4out);

para procesar múltiples dataunits a la vez. ¿Esto sería beneficioso para hacer el uso del compilador instrucciones SSE?

Gracias!

¿Fue útil?

Solución

  

Estoy trabajando en Visual Studio 2008 y en la configuración del proyecto que veo la opción para "activar conjunto de instrucciones extendido", que puedo en Ninguno, SSE o SSE2

     

Así que el compilador tratará de instrucciones por lotes juntos con el fin de hacer uso de las instrucciones SIMD?

No, el compilador no utilizar instrucciones vectoriales por sí sola. Se utilizará instrucciones SSE escalares en lugar de los x87.

Lo que usted describe se llama "vectorización automática". compiladores de Microsoft no hacen esto, compiladores Intel hacen.

En Microsoft compilador puede utilizar intrínsecos para realizar optimizaciones manuales SSE .

Otros consejos

Tres observaciones.

  1. Los mejores aceleraciones no son procedentes de optimizaciones pero a partir de buenos algoritmos . Así que asegúrese de obtener esa parte derecha primero. A menudo esto significa simplemente usando las bibliotecas adecuadas para su dominio específico.

  2. Una vez que sus algoritmos de la derecha es el momento de Medida . A menudo hay una regla de 80/20 en el trabajo. El 20% de su código se llevará el 80% del tiempo de ejecución. Sin embargo, con el fin de localizar la parte que necesita un buen perfilador. Intel VTune le puede dar muestras de perfil de cada función y agradables informes que localizar a los asesinos de rendimiento. Otra alternativa es libre AMD CodeAnalyst si tiene una CPU de AMD.

  3. La capacidad autovectorization compilador no es una bala de plata. A pesar de que se trate realmente difícil (especialmente Intel C ++ ) se quiere a menudo necesitan para ayudar a que mediante la elaboración de algoritmos en forma vectorial. A menudo puede obtener resultados mucho mejores por handcrafting pequeñas porciones de código cuello de botella para usar las instrucciones SIMD. Puede hacerlo en el código C (véase el enlace de VJO arriba) utilizando los intrínsecos o el uso en línea de montaje.

Por supuesto las partes 2 y 3 forman un proceso iterativo. Si usted es realmente serio acerca de esto, entonces hay algunos libros buenos sobre el tema por la gente de Intel como El Software Optimization Cookbook y los manuales de referencia del procesador.

El compilador no es todo poderoso, y tiene algunas limitaciones. Si se puede (y si las banderas correctas se pasan a la misma), se utilizará instrucciones SSE. La única manera de ver lo que hizo es examinar el código ensamblador generado por el compilador.

Otra opción es utilizar las instrucciones C SSE / SSE2. Por las ventanas se puede encontrar aquí:

http://msdn.microsoft.com/ en-us / library / y0dh78ez% 28VS.80% 29.aspx

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