2

私はRiceを使用してRubygemのC++拡張機能を作成しています。拡張子は共有オブジェクト(.so)ファイルの形式です。

これには、「mkmf」ではなく「mkmf-rice」が必要ですが、2つ(AFAIK)は非常に似ています。

デフォルトでは、コンパイラはフラグを使用します-g -O2。個人的には、最適化を有効にしてデバッグするのは難しいので、この種のばかげていると思います。Makefileを編集して、気に入らないフラグを削除しました(たとえば、Rubyのフックの代わりに-fPIC -sharedデバッグが必要な場合は削除します)。main()

しかし、もっと良い方法が必要だと思います。私はただできることを知っています

$CPPFLAGS += " -DRICE"

追加のフラグを追加します。しかし、Makefileを直接編集せずに物を削除するにはどうすればよいですか?

二次的な質問:Rubyによってロードされた共有オブジェクトに対してどの最適化が安全ですか?私はそのようなことをすることができます-funroll-loopsか?皆さんは何をお勧めしますか?

これは科学計算プロジェクトなので、速いほど良いです。メモリはそれほど問題ではありません。

4

2 に答える 2

2

を定義するには

-D name=definition

あなたの例のように:

$CPPFLAGS += " -DRICE"

-U name
組み込みまたは-Dオプション付きの、以前の名前の定義をキャンセルします。

$CPPFLAGS += " -URICE"

あなたが望むように-O2の定義を解除するのに役立つかどうかはわかりませんが。

于 2010-06-03T07:08:40.877 に答える
1

手っ取り早い方法は、CXXFLAGSに-O0を追加することです。これにより、最適化がオフになります。後のオプションは前のオプションを上書きします。

プラグインの安全性に関しては、ABIに影響を与えないことは何でもできるはずです。テストなしでは、-funrollがなぜそうなるのかわかりません。もちろん、安全はより良いことを意味するものではありません。マニュアルページに記載されているように、「-funroll-loopsはコードを大きくし、実行速度を上げる場合とそうでない場合があります。」

于 2010-06-02T23:17:31.813 に答える