2012-06-03 16 views
5

Estoy trabajando con el conjunto de instrucciones SSE2 en MS Visual Studio. Lo estoy usando para hacer algunos cálculos con datos de 16 bits.¿Cómo se define una constante de 128 bits de manera eficiente?

Supongamos que tengo 8 valores cargados en un registro SSE. Quiero agregar una constante (por ejemplo, 42) a todos ellos. Aquí es cómo me gustaría que se vea mi código.

__m128i values; // 8 values, 16 bits each 
const __m128i my_const_42 = ???; // What should i write here? 
values = _mm_add_epi16(values, my_const_2); // Add 42 to the 8 values 

Ahora, ¿cómo puedo definir la constante? Las dos formas siguientes funcionan, pero una es ineficiente y la otra es fea.

  1. my_const_42 = _mm_set_epi16(42, 42, 42, 42, 42, 42, 42, 42) - 8 compilador genera comandos para "construir" la constante
  2. my_const_42 = {42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0} - difícil de entender lo que está pasando; cambiando 42 a, p. -42 no es trivial

¿Hay alguna forma de expresar la constante de 128 bits más cómodamente?

+1

Quizás usar una macro para el segundo método esté bien – valdo

Respuesta

8

Noventa por ciento de la batalla es encontrar la intrínseca correcta. La biblioteca de MSDN está bastante bien organizada, comience en this page. A partir de ahí, desglosar así:

  • Usted sabe que desea utilizar "MMX, SSE y SSE2 intrínseco", haga clic en ese enlace
  • Sabe que desea utilizar "Extensiones Streaming SIMD 2", haga clic en ese
  • enlace
  • siguiente enlace es atractiva "Entero memoria e inicialización", ya que no desea que coma flotante
  • usted obtendrá dos enlaces relevantes, la carga y las operaciones Set de
  • carga simplemente le consigue las que ya tenían de

El conjunto es dorado, sale _mm_set1_epi16 (short w)

2

Algo a tener en cuenta acerca de la creación de constantes en SSE (o NEON). La carga de datos de la memoria es extremadamente lenta en comparación con la ejecución de la instrucción. Si necesita una constante que sea posible crear a través del código, esa es la opción más rápida. Aquí hay algunos ejemplos de constantes creadas a través del código:

xmmTemp = _mm_cmpeq_epi16(xmmA, xmmA); // FFFF 
xmmTemp = _mm_slli_epi16 (mmxTemp, 7); // now it has 0xFF80 (-128) 

xmmTemp = _mm_cmpeq_epi16(xmmA, xmmA); // FFFF 
xmmTemp = _mm_slli_epi16 (mmxTemp, 15); // 0x8000 
xmmTemp = _mm_srli_epi16 (mmxTemp, 11); // 0x10 (positive 16) 
Cuestiones relacionadas