Pregunta

Si entiendo correctamente, __declspec(noalias) le dice al compilador que ninguno de los punteros pasados como parámetros es un alias.

__declspec(noalias) void multiply(float * a, float * b, float * c)
{
    ...
}

Dicho de otra manera, si no me equivoco , es exactamente equivalente a la llamada __restrict en cada parámetro de tipo puntero.Pero hay una manera de hacerlo sin cambiar todas las llamadas a la función?Lo ideal sería sustituir __declspec(noalias) con una definición de preprocesador.

¿Fue útil?

Solución

Creo que eres la interpretación de noalias incorrectamente;no es la misma como la especificación de los __restrict en cada parámetro.En el ejemplo de referencia de MSDN, significa que a, b, y c no modifique o hacer referencia a cualquier estado global (de la actual unidad de compilación), pero son libres de alias el uno al otro.Usted podría también especificar __restrict en cada uno de ellos para indicar que no se alias el uno al otro.No estoy seguro de por qué usted menciona el cambio de todas las llamadas de función en esta situación;mientras las llamadas sin alias de los argumentos, nada cambia en el sitio de llamada.Usted debe revisión todas las llamadas, pero ellos no tienen que cambiar a menos que usted necesita para eliminar el aliasing.Específicamente, __restrict es no se necesita en el sitio de llamada.

El único análogo en GCC sería especificar __restrict (o más comúnmente para GCC, __restrict__) en cualquier puntero global declaraciones de variables en el mismo archivo de origen (que son de tipos compatibles).Ver aquí sobre archivo-alcance restrict-calificados punteros.Por supuesto, no hay ninguna garantía de que GCC se comportará de manera diferente, ya que restrict se considera a menudo en el ámbito de la función.Microsoft introdujo claramente noalias para permitir una optimización específica que introdujo.

Larga historia corta, no hay macro truco aquí (aparte de la mencionada, por R a ignorar __declspec() completamente de GCC).Lo mejor que puedes hacer es agregar __restrict para cualquier no-alias parámetro de puntero y global de las declaraciones de variables.

Otros consejos

Sólo #define __declspec(x) (para una definición en blanco).La omisión de noalias/restringir no voy a hacer ningún cambio a la comportamiento de un programa correcto.Todo lo que hace es crear más (generalmente de muy menor, con la actual tecnología del compilador) oportunidades para el compilador para optimizar.

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