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