我必须在某些算法中利用PpenMP,为此我需要一些数学函数,如eig
或svd
,因为它在MATLAB中可用,并且它在MATLAB中非常快。我已经使用OpenMP
但我不知道为什么我的OpenMP并行化代码比串行代码慢得多,可能是库中有一些错误,或者函数random
,eig
或{ {1}}阻止?我不知道如何解决这个问题,有些人可以建议我使用OpenMP最兼容的数学库。
答案 0 :(得分:2)
我可以推荐英特尔的MKL;请注意,这笔费用可能会影响您的决定。我既不知道也不关心它是用什么语言编写的,只要它提供可从我选择的语言调用的API。我的是Fortran,但它也有C的绑定
如果你环顾四周,你会发现许多人的第一个(或第二个或第三个)OpenMP程序实际上比他们的串行版本慢的问题。看看一些答案。不要认为有一个库的形状的魔术子弹,以使您的代码更快。相反,要意识到你很可能已经编写了一个很差的并行程序并修复了它。
最后,如果您安装了Matlab,不要期望能够编写自己的例程来超越Matlab。我不会说不能这样做,但我认为你会发现它很难。
答案 1 :(得分:1)
GSL与OpenMP兼容。您可以尝试使用免费试用版的英特尔数学核心库。 如果加速不是那么多,那么代码可能并不是很多可并行化的。您可能希望调试并查看英特尔®线程检查器中正在运行的线程的详细信息,这可能有助于查看瓶颈所在。
答案 2 :(得分:1)