gpt4 book ai didi

wolfram-mathematica - Mathematica -- 如何编译 BitShiftRight(或 Left)?

转载 作者:行者123 更新时间:2023-12-04 15:35:39 24 4
gpt4 key购买 nike

我想编译一个 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/1403 BitShiftRight 不可编译,对 MainEvaluate 的调用严重拖累了我的函数。我非常惊讶的是,这种非常低级的通用函数是不可编译的,而 BitAnd、BitNot、BitOr、BitXor 是!
有人知道(快速)解决方法吗?我可以使用 MathLink 调用 C 语言函数,但我的目标是在 Manipulate[] 中使用此函数并将其部署为独立的 cdf 文件。而且我知道在这种情况下我不能使用 MathLink,对吗?顺便说一句,那里有一些易于处理的解决方法吗?

最佳答案

如果除以 32,编译器可能会将其重写为移位。您还应该尝试在 Mathematica 中直接除以 32,确保您的数据是并且保持打包 (Developer`ToPackedArray[])。来回发送数据的开销可能不值得用 C 语言计算。

关于wolfram-mathematica - Mathematica -- 如何编译 BitShiftRight(或 Left)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11148608/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com