Cython最快的高频控制循环传递浮点数的方法

问题描述 投票:0回答:1

我在一个c++类中有一个函数(func),想从python端调用它,以调用以下序列,并使用 尽可能低的延迟:

1_在python方面:func(np.array([1,2,3,4,5])或func([1,2,3,4,5])或二维数组,以及你对降低延迟的任何其他建议。

2_在c++方面:我有一个类型为 "占位符 "的占位符。franka::RobotState robot_state_。 我想把上面数组的一部分复制到里面去,比如我可以这样做。

for (int i = 0; i < 7; ++i) {
        robot_state_.q     [i] = array_that_came_from_python_side  [i];
        robot_state_.dq    [i] = array_that_came_from_python_side  [i+7];
        robot_state_.tau_J [i] = array_that_came_from_python_side  [i+14];
    }

3_然后我已经写好的下一行会更新另一个占位符的类型 法兰卡::扭矩_eff_cmd 我想将其返回到python端,并想象像下面这样做。

for (int i = 0; i < 7; ++i) {
    array_to_return[i] = _eff_cmd[i]
    }
    return array_to_return // to be sent to the python side

其中array_to_return可以在python端用任何类型返回,如numpy数组或list或任何其他建议,如输入。 然后我将在python端以高频率重复这个序列,因为它基本上是一个控制反馈循环。

我的问题是如何在Cython中以最快的方式实现这个功能,我在C++中用什么来定义func。以下是 这条 一种可能的方式,提供了一个较低的延迟似乎 记忆之窗但到目前为止,我还不能很好地理解它,以知道我最好在c++代码和Cython pyx文件中写什么。如果有谁能指导我,我将非常感激,如果你也有其他的建议,而不是内存视图,我将会非常感激 低延迟.

python c++ numpy cython memoryview
1个回答
0
投票

当涉及到性能优化时,你必须要测量!

首先确保你确切知道你的热点在哪里。你可以使用 perf 或英特尔 vTune 以确保你优化的位置正确。

比你可以写一个 google benchmark 测试那个特定的热点。

如果这个片段是你的热点,拆分循环会帮助你,因为你有连续的内存访问。

for (int i = 0; i < 7; ++i) {
        robot_state_.q    [i] = array_that_came_from_python_side  [i+7];
}
for (int i = 0; i < 7; ++i) {
        robot_state_.dq     [i] = array_that_came_from_python_side  [i+7];
}
for (int i = 0; i < 7; ++i) {
        robot_state_.tau_J [i] = array_that_came_from_python_side  [i+14];
}

或者它可能什么都不会做,因为现在的编译器非常聪明。

也许 std::memcopy 会做得很好

std::memcpy(robot_state_.q, &array_that_came_from_python_side[0], 7);
std::memcpy(robot_state_.dq, &array_that_came_from_python_side[7], 7);
std::memcpy(robot_state_.tau_J , &array_that_came_from_python_side[14], 7);
© www.soinside.com 2019 - 2024. All rights reserved.