Как мне указать extconf.rb использовать дополнительные флаги оптимизации g++, и какие из них целесообразны?
Я использую Райс, чтобы написать расширение C++ для Ruby Gem. Расширение имеет форму файла общего объекта (.so).
Это требует "mkmf-rice" вместо "mkmf", но эти два (AFAIK) очень похожи.
По умолчанию компилятор использует флаги -g -O2
, Лично я нахожу этот вид глупым, поскольку его трудно отлаживать при любой включенной оптимизации. Я прибег к редактированию Makefile, чтобы убрать ненужные мне флаги (например, удаление -fPIC -shared
когда мне нужно отладить с помощью main()
вместо рубиновых крючков).
Но я думаю, что должен быть лучший путь. Я знаю, я могу просто сделать
$CPPFLAGS += " -DRICE"
добавить дополнительные флаги. Но как мне удалить вещи, не редактируя Makefile напрямую?
Вторичный вопрос: какие оптимизации безопасны для общих объектов, загружаемых Ruby? Могу ли я сделать такие вещи, как -funroll-loops
? Что вы все рекомендуете?
Это научный вычислительный проект, поэтому чем быстрее, тем лучше. Память не является большой проблемой.
Большое спасибо!
2 ответа
Быстрый и грязный способ - добавить -O0 к CXXFLAGS, что отключит оптимизацию. Более поздние параметры будут переопределять более ранние.
Что касается безопасности для плагина, вы должны иметь возможность делать все, что не влияет на ABI. Без тестирования я не понимаю почему -funroll. Конечно, безопасность не означает, что лучше. Как отмечается на странице руководства, "-funroll-loops делает код больше и может или не может заставить его работать быстрее".
Для определения вы используете
-D name=definition
как вы делаете в своем примере:
$CPPFLAGS += " -DRICE"
-У имя
Отмените любое предыдущее определение имени, встроенное или снабженное опцией -D.
$CPPFLAGS += " -URICE"
Хотя я не уверен, поможет ли это с неопределением -O2, как вы этого хотите.