Как мне перенести код, содержащий #pragma optimize (“a”), из VC ++ 7 в VC ++ 9?

StackOverflow https://stackoverflow.com/questions/1299422

Вопрос

Я переношу свою кодовую базу C ++ из Visual Studio 2k3 в Visual Studio 2k8.Код содержит

#pragma optimize( "a", on )

MSDN говорит что это означает "не предполагать сглаживания".Более поздние версии VS отказываются компилировать это, и MSDN, похоже, не говорит, что делать с кодом, содержащим эту #pragma.

Что означает "предполагать отсутствие сглаживания" и как мне принять решение о том, что делать с этой строкой кода?

Это было полезно?

Решение

Псевдоним - это когда у вас есть что-то подобное:

int a[100];

int * p1 = &a[50];
int * p2 = &a[52];

Теперь a, p1 и p2 - это псевдонимы для массива или его частей.Эта ситуация может помешать компилятору создать оптимальный код доступа к массиву (FORTRAN запрещает это, вот почему он так хорош с производительностью массива).

Прагма, о которой вы спрашиваете, говорит, что компилятор может предположить, что описанной выше ситуации не существует.Очевидно, что если вам нужно решить, нужно ли вам для этого вы можете сделать одну из двух вещей:

  • проверьте весь ваш код (сложный и подверженный ошибкам)
  • выключите его и посмотрите, есть ли какие-либо снижения производительности (просто и разумно)

Выбор за вами :-)

Другие советы

Добавление к тому, что сказал Нил:

С помощью pragma вы гарантируете компилятору, что псевдонимирование не происходит, что позволяет выполнять дополнительную оптимизацию, которая невозможна для "стандартного" кода.

В порт: удалите pragma, затем сравните время выполнения сборки VC7 и VC9.Если сборка VC9 выполняется адекватно, все готово.

В противном случае, если сборка VC9 выполняется значительно медленнее, сравните сборку VC7 без #pragma для сборки VC9.Если причиной разницы в скорости являются дополнительные оптимизации, сборка VC7 теперь должна быть замедлена до сборки VC9.

Если это так, загляните в __restrict / __declspec(noalias) объявления и, в частности, ссылки без псевдонимов в затронутом блоке кода.Используйте профилировщик, чтобы найти различия между кодом.

В противном случае разница в скорости не связана с #pragma.

MSDN определите псевдонимирование как использование нескольких имен, которые ссылаются на одну и ту же ячейку памяти.

В #pragma директива, используемая для управления этой оптимизацией в VS.NET, исчезла с 2005 года.

Кажется , что __restrict ключевое слово и restrict и noalias __declspec модификаторы, используемые для аннотирования переменных и функций, могли бы выполнять ту же работу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top