【发布时间】:2020-03-16 19:00:42
【问题描述】:
我有一个用 Haskell 编写的小函数,类型如下:
foreign export ccall sget :: Ptr CInt -> CSize -> Ptr CSize -> IO (Ptr CInt)
我从同时运行的多个 C++ 线程调用它(通过 待定)。在执行程序的这一部分期间,我几乎无法获得 即使我在六核 CPU(12 逻辑核心)。因此,我怀疑要么调用 Haskell 通过单个线程汇集,或者有一些重要的 同步进行中。
我没有明确地做任何这样的事情,函数所做的只是操作 在传入数据上(在将其存储到 Data.Vector.Storable 之后),以及 将结果作为新分配的数组返回(来自 Data.Marshal.Array)。
我需要做些什么来完全启用这样的并发调用吗?
我在 Debian Linux (bullseye/testing) 上使用 GHC 8.6.5,并且正在使用 -threaded -O2 进行编译。
期待阅读一些建议,
塞巴斯蒂安
【问题讨论】:
-
更新: 我发现添加运行时选项
+RTS -N2 -RTS会有所改进。在Documentation 中,我认为这只会影响 imported forgein 函数,但在这种情况下可能有帮助的是它启用了并行垃圾收集,如here 所述。然而,它仍然不是很好,而且我发现使用大于 2 的数字的性能比-N2更差。 -
Haskell 程序是否与
-threaded关联?这就是 here 指定的内容。 -
是的,对于编译和链接,我都指定了
-threaded选项。
标签: c++ multithreading haskell ffi