【问题标题】:Impact of calling external C function on CPU time in OpenModelica在 OpenModelica 中调用外部 C 函数对 CPU 时间的影响
【发布时间】:2021-08-16 14:59:45
【问题描述】:

我们已经在 C 中实现了一个外部延迟函数,我们想在我们的 Modelica 模型(传输线)中调用它。我们的目标是加速 CPU 时间。不幸的是,它增加了 CPU 时间。
我的问题是:

  1. 与现有的内置延迟相比,调用外部函数是否主要增加了 Modelica 中的仿真时间?

  2. 在 OpenModelica 中使用外部对象会显着增加仿真时间吗?

  3. 如何使用 Open MP 仅编译我们的外部函数(我们如何才能为外部函数添加 -fopenmp 标志)? 当我们没有使用上面的标志(如下图所示)时,会产生以下错误(见下图),但是从编译开始就使用该标志,使模拟时间变长,而我们期望的模拟时间更短。 PS:我们的函数被编译为一个包含 -fopenmp 标志的库。

【问题讨论】:

    标签: openmp modelica openmodelica


    【解决方案1】:
    1. 与现有的内置延迟相比,调用外部函数是否主要增加了 Modelica 中的仿真时间?

    没有。这是一个非常简单的调用,您只能在 Modelica 中明确定义的时间点使用外部函数调用。但是,如果您引入代数循环,您可能会遇到问题。

    1. 在 OpenModelica 中使用外部对象是否会显着增加仿真时间?

    没有。它只是一个指针。如果某些东西很慢,它是在外部对象本身或它是如何使用的。

    1. 如何使用 Open MP 仅编译我们的外部函数(我们如何为外部函数添加 -fopenmp 标志):链接源文件时?当我们没有使用上述标志时会产生以下错误,但是从编译开始就使用该标志,使模拟时间变长,而我们期望的模拟时间更短。 PS:我们的函数被编译为一个库,我们在其中包含了 -fopenmp 标志。

    您提前编译库并将 -fopenmp 标志添加到链接器标志或外部函数的库注释中。在 OpenMP 中仅使用 1 个线程时代码运行速度会变慢吗?编写快速并行代码很困难,而且 OpenMP 隐藏了很多细节,所以很难知道为什么它运行得更慢。

    【讨论】:

    • 谢谢,@sjoelund.se,关于你的第三点,我们如何在链接器标志中添加 -fopenmp 标志
    • 在 OMEdit 中,在 Tools -> OMC CLI 下可以输入setLinkerFlags("-fopenmp")。不过,这仅对当前会话有效。否则,您可以使用注释:external "C" annotation(Library="-fopenmp");,但这可能无法跨工具移植(可能编译器不使用-fopenmp 标志)。
    • 我们的外部函数包含一个具有 3 次独立迭代的循环,我们决定将它们并行化(使用 3 个线程)并且我们期望改进,但是,模拟需要更多时间。你有什么主意吗? (我们添加了链接器标志“setLinkerFlags("-fopenmp"),我们尝试更改环境变量 OMP_NUM_THREAD 但它并没有提高 CPU 时间)。
    • 创建线程会产生开销,这可能会使完成 1 次迭代所需的时间相形见绌。你知道每次迭代需要多长时间吗?使用 SIMD 可能比线程更好。请参阅lemire.me/blog/2020/01/30/cost-of-a-thread-in-c-under-linux 了解线程创建+加入(9~200 毫秒)的一些估计。由于这是针对传输线的,我假设该函数被多次调用;你会得到每次调用函数的开销。您需要非常多的独立任务或需要很长时间(几秒钟)才能从并行化中受益的少数任务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多