Как мне указать extconf.rb использовать дополнительные флаги оптимизации g ++, и какие из них целесообразны? - PullRequest
2 голосов
/ 03 июня 2010

Я использую Rice , чтобы написать расширение C ++ для драгоценного камня Ruby. Расширение имеет форму файла общего объекта (.so).

Для этого требуется «mkmf-rice» вместо «mkmf», но оба (AFAIK) очень похожи.

По умолчанию компилятор использует флаги -g -O2. Лично я нахожу этот вид глупым, поскольку его трудно отлаживать при любой включенной оптимизации. Я прибег к редактированию Makefile, чтобы убрать ненужные мне флаги (например, удалить -fPIC -shared, когда мне нужно отладить, используя main() вместо хуков Ruby).

Но я полагаю, что должен быть лучший путь. Я знаю, что могу просто сделать

$CPPFLAGS += " -DRICE"

для добавления дополнительных флагов. Но как мне удалить вещи, не редактируя Makefile напрямую?

Вторичный вопрос: какие оптимизации безопасны для общих объектов, загружаемых Ruby? Могу ли я сделать что-то вроде -funroll-loops? Что вы все рекомендуете?

Это научный вычислительный проект, поэтому чем быстрее, тем лучше. Память не является большой проблемой.

Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 03 июня 2010

Для определения вы используете

-D name=definition

как вы делаете в своем примере:

$CPPFLAGS += " -DRICE"

-U имя
Отмените любое предыдущее определение имени, встроенное или снабженное параметром -D.

$CPPFLAGS += " -URICE"

Хотя я не уверен, поможет ли это с неопределением -O2, как вы этого хотите.

1 голос
/ 03 июня 2010

Быстрый и грязный способ - добавить -O0 к CXXFLAGS, что отключит оптимизацию. Более поздние параметры будут переопределять более ранние.

Что касается безопасности для плагина, вы должны иметь возможность делать все, что не влияет на ABI. Без тестирования я не понимаю почему -funroll. Конечно, безопасность не означает, что лучше. Как отмечено на странице руководства, «-funroll-loops делает код больше и может или не может заставить его работать быстрее».

...