2008-09-23 10 views
13

Escribo un código y trato de acelerarlo utilizando SIMD intrinsics SSE2/3. Mi código es de tal naturaleza que necesito cargar algunos datos en un registro XMM y actuar sobre él muchas veces. Cuando miro el código de ensamblador generado, parece que GCC sigue volviendo a tirar los datos a la memoria, para volver a cargar algo más en XMM0 y XMM1. Estoy compilando para x86-64, así que tengo 15 registros. ¿Por qué GCC usa solo dos y qué puedo hacer para pedirle que use más? ¿Hay alguna forma de que pueda "fijar" algún valor en un registro? Agregué la palabra clave "registrar" a mi definición de variable, pero el código ensamblador generado es idéntico.¿Cómo hacer que GCC use más de dos registros SIMD cuando usa intrínsecos?

+0

Estoy teniendo el mismo problema, con ARM. AFAICT, la sintaxis que estoy usando es correcta: coincide con la especificada en los documentos de GCC. Sin embargo, me da el mismo error ... Me pregunto si los últimos GCC están molestos en este sentido. –

+0

Ah, lo siento, mi comentario es, de hecho, con respecto al problema que describe florin en su comentario a la respuesta a continuación (el uso de asm ("regname") genera un error). –

+1

un motivo común para este comportamiento no es habilitar optimizaciones (-O1, -O2 o -O3), cuando se usan intrínsecos sin optimizaciones, se vaciará en la memoria cada vez y esencialmente solo usará 2-3 registros simd – jtaylor

Respuesta

3

Sí, puedes. Explicit Reg Vars habla sobre la sintaxis que necesita para fijar una variable en un registro específico.

+0

Intenté >> registrar __m128i v0 asm ("xmm7"); << pero al compilador no le gusta >> error: expected '=', ',', ';', 'asm' o '__attribute__' antes de 'asm' <<. – florin

+0

¿Incluyó #include ? –

2

Si está llegando al punto en que está especificando registros individuales para cada intrínseco, también puede escribir el directorio de ensamblaje, especialmente dado el desagradable hábito de gcc de pesimizar intrínsecos innecesariamente en muchos casos.

Cuestiones relacionadas