私は無駄にウェブを精査しました。
XcodeとVisualC++が非正規化された数値を0として扱う方法はありますか?IDE設定にこのオプションをオンにするオプションがあると思っていたのですが、見つからないようです。
私はいくつかのクロスプラットフォームオーディオをやっていて、特定のプロセッサがリソースを占有するのを止める必要があります。
乾杯
私は無駄にウェブを精査しました。
XcodeとVisualC++が非正規化された数値を0として扱う方法はありますか?IDE設定にこのオプションをオンにするオプションがあると思っていたのですが、見つからないようです。
私はいくつかのクロスプラットフォームオーディオをやっていて、特定のプロセッサがリソースを占有するのを止める必要があります。
乾杯
MXCSRレジスタ(SSEを使用するx86またはx86-64)でFTZおよび/またはDAZを設定するプラットフォーム定義の方法を探しています。https://stackoverflow.com/a/2487733/567292を参照してください
通常、これは次のようなものと呼ばれます_controlfp
。Microsoftのドキュメントはhttp://msdn.microsoft.com/en-us/library/e9b52ceh.aspxにあります
_MM_SET_FLUSH_ZERO_MODE
次のマクロを使用することもできます:http: //msdn.microsoft.com/en-us/library/a8b5ts9s (v = vs.71).aspx-これはおそらく最もクロスプラットフォームのポータブルな方法です。
非正規化数をグローバルに無効にするために、次の2つのマクロを使用します。
//warning these macros has to be used in the same scope
#define MXCSR_SET_DAZ_AND_FTZ \
int oldMXCSR__ = _mm_getcsr(); /*read the old MXCSR setting */ \
int newMXCSR__ = oldMXCSR__ | 0x8040; /* set DAZ and FZ bits */ \
_mm_setcsr( newMXCSR__ ); /*write the new MXCSR setting to the MXCSR */
#define MXCSR_RESET_DAZ_AND_FTZ \
/*restore old MXCSR settings to turn denormals back on if they were on*/ \
_mm_setcsr( oldMXCSR__ );
プロセスの最初に最初のものを呼び出し、最後に2番目のものを呼び出します。残念ながら、これはWindowsではうまく機能しないようです。
非正規化数をローカルでフラッシュするには、これを使用します
const Float32 k_DENORMAL_DC = 1e-25f;
inline void FlushDenormalToZero(Float32& ioFloat)
{
ioFloat += k_DENORMAL_DC;
ioFloat -= k_DENORMAL_DC;
}
これを行うには、プログラムの起動時にIntelIntrinsicsマクロを使用します。例えば:
#include <immintrin.h>
int main() {
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
}
私のバージョンのMSVCでは、これにより次のアセンブリコードが出力されました。
stmxcsr DWORD PTR tv805[rsp]
mov eax, DWORD PTR tv805[rsp]
bts eax, 15
mov DWORD PTR tv807[rsp], eax
ldmxcsr DWORD PTR tv807[rsp]
MXCSRは制御およびステータスレジスタであり、このコードはビット15を設定しており、フラッシュゼロモードをオンにします。
注意すべき1つのこと:これは、計算から生じる非正規化数にのみ影響します。非正規化数を入力として使用する場合もゼロに設定する場合は、次のコマンドを使用して、DAZフラグ(非正規化数はゼロ)も設定する必要があります。
_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);
詳細については、 https://software.intel.com/en-us/cpp-compiler-developer-guide-and-reference-setting-the-ftz-and-daz-flagsを参照してください。
また、含まれている値は各スレッドに対してローカルであるため、スレッドごとにMXCSRを設定する必要があることにも注意してください。