Как портировать __declspec (noalias) на GCC - PullRequest
2 голосов
/ 10 марта 2012

Если я правильно понял, __declspec(noalias) сообщает компилятору, что ни один из указателей, переданных в качестве параметров, не является псевдонимом.

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

Сказано иначе, если я не ошибаюсь, это в точности эквивалентно вызову__restrict для каждого параметра типа указателя.Но есть ли способ сделать это без изменения всех вызовов функций?В идеале я бы заменил это __declspec(noalias) на определение препроцессора.

Ответы [ 2 ]

2 голосов
/ 17 декабря 2013

Я думаю, что вы неправильно интерпретируете noalias;это не то же самое, что указание __restrict для каждого параметра.В примере , на который вы ссылаетесь из MSDN , это означает, что a, b и c не изменяют и не ссылаются на какое-либо глобальное состояние (текущей единицы компиляции), но они свободныпсевдоним друг друга.Вы можете также указать __restrict для каждого, чтобы указать, что они не псевдонимы друг друга.Я не уверен, почему вы упоминаете об изменении всех вызовов функций в этом сценарии;до тех пор, пока вызывающий абонент не назовет аргументы, на сайте вызовов ничего не изменится.Вы должны просмотреть все вызовы, но они не должны изменяться, если вам не нужно удалить псевдонимы.В частности, __restrict - это , а не , необходимый на месте вызова.

Единственным аналогом в GCC будет указание __restrict (или чаще для GCC ,__restrict__) в любых объявлениях переменных глобальных указателей в одном и том же исходном файле (которые имеют совместимые типы).См. здесь о указателях для файловой области restrict.Конечно, нет никакой гарантии, что GCC будет вести себя иначе, поскольку restrict часто рассматривается только в области действия функции.Microsoft четко представила noalias, чтобы включить специфическую оптимизацию, которую они представили.

Короче говоря, здесь нет трюка с макросами (кроме упомянутого R, чтобы полностью игнорировать __declspec() в GCC).Лучшее, что вы можете сделать, это добавить __restrict к любому параметру указателя без псевдонима и объявлениям глобальных переменных.

0 голосов
/ 11 марта 2012

Просто #define __declspec(x) (к пустому определению). Пропуск noalias / restrict не изменит поведение правильной программы. Все, что он делает - это создает дополнительные (обычно очень незначительные, с современной технологией компилятора) возможности для оптимизации компилятором.

...