7

速度を求めているので、Mathematica モジュールをコンパイルしたいと考えています。

    testC = Compile[{{inputInt, _Integer}},
      Module[{outputInt, bitShift = 5},
      outputInt = BitShiftRight[inputInt, bitShift]
      ]
      , CompilationTarget -> "C", RuntimeOptions -> "Speed"
      , CompilationOptions -> {"ExpressionOptimization" -> True, 
       "InlineCompiledFunctions" -> True, 
       "InlineExternalDefinitions" -> True}
    ];

私の実際の関数はもっと長いですが、非常に単純な構造を持ち、リストを使用し、Total、Table、BitAnd、If の関数のみを含んでいます。すべてのコンパイルおよびランタイム オプションは、この 1 行の抽出ではなく、実際の関数で (おそらく) 役立ちます。

設定しました

SetSystemOptions["CompileOptions" -> "CompileReportExternal" -> True];

何が起こるか確認できるように

CompilePrint[testC]

次の結果が得られます

    1 argument
    3 Integer registers
Underflow checking off
Overflow checking off
Integer overflow checking off
RuntimeAttributes -> {}

    I0 = A1
    I1 = 5
    Result = I2

    1   I2 = MainEvaluate[ Hold[BitShiftRight][ I0, I1]]
    2   Return

このスレッドhttps://mathematica.stackexchange.com/a/1101/1403から期待/恐れられているように、BitShiftRight はコンパイル可能ではなく、MainEvaluate へのこの呼び出しは私の機能に深刻な影響を与えます。BitAnd、BitNot、BitOr、BitXor が . (速い)回避策を知っている人はいますか?C 言語関数への MathLink 呼び出しを使用できますが、私の目的は、この関数を Manipulate[ ] で使用し、スタンドアロンの cdf ファイルとして展開することです。そして、このコンテキストでは MathLink を使用できないことを理解していますよね? ところで、扱いやすい回避策はありますか?

4

1 に答える 1

3

32 で除算すると、コンパイラはこれをシフトとして書き換える可能性があります。また、Mathematica で直接 32 で除算して、データがパックされていることを確認する必要があります (Developer`ToPackedArray[])。データをやり取りするオーバーヘッドは、C で計算するメリットに見合わないでしょう。

于 2012-06-22T02:24:59.410 に答える