Я хочу скомпилировать модуль 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, верно? Кстати, есть ли какой-нибудь обходной путь?