Mathematica — Как скомпилировать BitShiftRight (или Left)?

Я хочу скомпилировать модуль 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. Все параметры компиляции и выполнения полезны (возможно) в моей реальной функции, а не в этом извлечении одной строки.

Я установил

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/1403BitShiftRight не компилируется, и этот вызов MainEvaluate серьезно тормозит мою функцию. Я очень удивлен, что такого рода общие функции очень низкого уровня не компилируются, в то время как BitAnd, BitNot, BitOr, BitXor ! Кто-нибудь знает (быстрый) обходной путь? Я могу использовать вызов MathLink для функции языка C, но моя цель состоит в том, чтобы использовать эту функцию в Manipulate[ ] и развернуть ее как отдельный файл cdf. И я так понимаю, что в этом контексте я не могу использовать MathLink, верно? Кстати, есть ли какой-нибудь обходной путь?

6
задан Community 13 April 2017 в 12:55
поделиться