【发布时间】: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