Как мне указать 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, как вы этого хотите.

Другие вопросы по тегам