【问题标题】:Multithreaded WebAssembly slower in browser than singlethreaded, why?浏览器中的多线程 WebAssembly 比单线程慢,为什么?
【发布时间】:2019-02-17 00:44:50
【问题描述】:

在几年没有使用 Emscripten 之后,我最近发现它现在支持将多线程 C++ 代码编译为 WebAssembly。我整理了对 1000 万个浮点数进行排序的简单合并排序代码(本机代码可以轻松排序更多,但浏览器似乎将您限制为 1GB 内存):

https://github.com/bsergeev/MtMergeSort

令人惊讶的是,虽然这段代码编译为 WebAssembly 并在 Chrome 中运行,但由于使用了多个线程,浏览器中的排序变得越来越慢(而单线程性能正如预期的那样,是原生的 1.5...2 倍:本机代码 1.80 秒,WebAssembly 3.1...3.3 秒,JavaScript 4.69 秒):

浏览器限制 WebWorkers 是否会导致多线程性能下降?但是 WebAssembly 中的多线程又有什么意义呢?

【问题讨论】:

  • 资源争用可能是一个问题,阻碍了并行化。另一个常见原因是线程管理的成本超过了处理算法所需的时间。
  • 旁注:非现场资源的链接是不受欢迎的。堆栈溢出的目标是创建一个问题和编程问题答案的存储库,并且链接腐烂,使问题对跟随的程序员毫无用处。问题中必须包含解释问题所需的所有信息。
  • 当我运行你的代码时,它立即断言:Assertion 'l <= m && m <= r' failed.coliru.stacked-crooked.com/a/0373b0991417c4a0
  • 另外,为什么这段代码这么复杂?这似乎是严重的矫枉过正
  • 据我所见,coliru.stacked-crooked.com/a/4e3b5f481bba4157 做了同样的事情,只用了一半的代码。 (尽管仅当 #threads 是 2 的幂时才有效)

标签: c++ multithreading emscripten webassembly


【解决方案1】:

原来罪魁祸首是在merge() 的不同线程上分配左/右临时数组。一旦我在主线程上预先分配了临时数组,WebAssembly 就可以很好地扩展:

【讨论】:

    猜你喜欢
    • 2014-07-21
    • 2015-07-09
    • 1970-01-01
    • 2019-02-20
    • 2017-12-26
    • 2012-09-05
    • 1970-01-01
    • 2021-03-27
    相关资源
    最近更新 更多