gpt4 book ai didi

c++ - 随着线程数的增加,Lua 会扼杀多线程性能(包括条形图)

转载 作者:行者123 更新时间:2023-12-01 14:13:14 24 4
gpt4 key购买 nike

我的 Qt/C++ 应用程序使用工作线程 (QThread) 来提高具有多核处理器的用户的性能。每个 worker 的工作是操作一些数据。每个 worker 只管自己的事,不需要与任何其他 worker 交流。它们也不执行任何 IO 操作。完美的用例!

为这种工作负载使用多线程已令人欣喜地提高了许多方面的性能。

在锐龙 9 3900X(12 核)上运行


但是,现在每个工作人员还负责通过 Lua 脚本传递数据。因此,每个工作人员都获得了它自己的 Lua 脚本实例(一个包含它自己的 lua_State 的对象)。数据通过 userdata 在 native 代码和 Lua 脚本之间以指向这些东西的指针的形式传递,我称之为“SharedObjects”。我所要做的就是从这个 SharedObject 类派生出来,然后 Lua 就可以和它对话了!

我所有的 Lua 工作负载都是一些基本逻辑和调用 native 函数来分配从 SharedObject 派生的新事物并返回它们。基本上,它会创建很多 SharedObjects 并以特定方式将它们相互连接。


当脚本的工作负载较轻时,多线程性能保持良好。

但是一旦脚本的工作量很大,性能就会随着线程数上升到 4 以上而下降。

这是我运行的测试结果:

enter image description here

我不明白为什么繁重的工作负载会导致性能随着线程数的增加而变差???我希望它达到最大值和平坦线......


编辑:我创建了一个可以完美模拟问题的最小可重现示例项目。我使用 MSVC2010 编译(根据我的实际应用程序)。 https://github.com/MRG95/LuaThreads

GitHub项目文件说明:

  • main.cpp:入口点。创建工作人员并模拟工作负载。计时器会记录完成工作所需的时间。
  • Lua/lua_script.h:lua脚本与native代码的接口(interface)。通过 Qt 的 QMetaObject 实现可以访问 native 方法和属性。 void bindObject() 函数建立连接。
  • worker.h:定义通过 moveToThread 移动到其 QThreadWorker 类。脚本函数调用发生在 void doWork() 中。
  • tags.h/tags.cpp:在脚本中处理的示例数据类型。

在构建文件夹中有一个文件 testScript.lua,它是示例工作负载本身。这只是一个简单的循环,运行 tags.h 类中的一些方法。

最佳答案

Note the DirectConnection which means it's not queuing the calls.

这可能是错误的。阅读有关 QThread -s 的更多信息。也许你应该使用 Qt::QueuedConnection

让我们假设每个 QThread 运行它自己的 Lua 解释器和状态(你应该研究你的 Lua 解释器的源代码,但它可能有一些 GIL ,或者实际上需要一个)。

我们无法猜测您的源代码,但您可能希望使用每线程事件循环,并在其 QThread 中拥有每个 Lua 解释器,并对全局共享状态数据使用一些细粒度的 QMutex。如此小而短的 Lua 原语每个都会使用一些共享的 QMutex

请记住,Qt 图形操作仅允许从主线程(连接到 Xorg 上的 Linux 服务器的那个)。

But what I can't understand at all is why a heavy workload causes performance to get worse as thread count goes up???

可能与 CPU cachecache coherence 相关。当所有事件线程和进程的数量超过内核数量时,不要除了神奇的性能扩展。

This clearly indicates to me that Lua is the bottleneck

我不确定它是否正确,并且没有看到您的源代码,我相信它可能是错误的。 瓶颈可能在您自己的代码中(您没有显示)。可以肯定的是,研究一下 source code of Lua

您可以使用分析工具(在 Linux 上为 gprof(1)perf(1) )。如果你用 GCC 编译你的 C++ 代码和 Lua 的源代码,你可能特别需要 invoke it

关于c++ - 随着线程数的增加,Lua 会扼杀多线程性能(包括条形图),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62588083/

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