C 并行化LibTomMath';s Karatsuba impl。使用OpenMP失败

C 并行化LibTomMath';s Karatsuba impl。使用OpenMP失败,c,multithreading,recursion,parallel-processing,openmp,C,Multithreading,Recursion,Parallel Processing,Openmp,我原以为我会在自己推出OpenMP之前试一试,但我(它?)失败得很惨 Karatsuba乘法和平方运算需要一个小小的改变,才能递归到自身,而不是bn\u mp\u mul.c中常见的乘法分支和OpenMP pragmas的加法 将Karatsuba乘法更改为diff(平方以相同方式进行),以: 但是有更多的线程?嗯……有两条线 real 0m8.025s user 0m14.936s sys 0m0.060s 有四条线 real 0m14.198s user 0m48.

我原以为我会在自己推出OpenMP之前试一试,但我(它?)失败得很惨

Karatsuba乘法和平方运算需要一个小小的改变,才能递归到自身,而不是
bn\u mp\u mul.c
中常见的乘法分支和OpenMP pragmas的加法

将Karatsuba乘法更改为diff(平方以相同方式进行),以:

但是有更多的线程?嗯……有两条线

real    0m8.025s
user    0m14.936s
sys 0m0.060s
有四条线

real    0m14.198s
user    0m48.224s
sys 0m0.109s
您可以在绘图系统监视器中看到CPU在冒汗,但在这里没有用

我使用atanh()方法计算Libtomfloat中的常量log(2),并使用二进制分割算法实现acoth()的计算。该递归可以工作(在上面的测试中关闭),并且也可以使用OpenMP的
任务
以与Karatsuba递归相同的方式实现。对于log(2)(约5%)来说,它并没有获得多少收益,但它至少获得了一些收益,尽管5%非常接近统计误差

那么,我做错了什么

编辑

我按照RichardBruce的建议运行了一些测试来尝试开销。当Karatsube设置为250(对不起RichardBruce,是120而不是48)时,我得到了Karatsuba的一些最佳值,一个线程和四个线程以及1.5分钟的1.1分钟实时(对于200k位)。四个线程的用户时间:无增益。截止设置为500时,一个线程的实时时间为1.5分钟,四个线程的实时时间为1.3分钟,四个线程的用户时间为2.3分钟:相对增益,但绝对损耗


我真的没想到OpenMP会有这么多开销。那么,是手动pthreads还是有人发现了严重的错误?

我无法从差异中判断,但每个任务有多少工作量?为了支付线程开销,您需要在每个任务中完成约100000个工作周期,mult的任务截止时间为48。sqr为120。。你真的认为这是开销吗?我知道Linux中的线程不像其他地方那样轻量级,而是每个线程10^5次操作?我的数字来自Intel的线程构建块文档的旧版本。根据我的经验,它感觉很好,你需要相当多的工作周期才能使用threading@HighPerformanceMark我没有测量任何东西,我只是运行了一些简单的真实世界测试(TM),根据我使用pthreads的经验,我预计最多只会有一点损失,并且对这些巨大的损失感到非常困惑,以至于我真的认为我做错了什么。我瞥了一眼libgomp,发现了大量开销的很多原因,特别是巨大的安全网,它吃了很多东西。但是用pthreads手工实现这个东西是复杂的、乏味的、容易出错的,所以OpenMP绝对值得一试。我不能从差异中真正分辨出来,但是每个任务有多少工作量?为了支付线程开销,您需要在每个任务中完成约100000个工作周期,mult的任务截止时间为48。sqr为120。。你真的认为这是开销吗?我知道Linux中的线程不像其他地方那样轻量级,而是每个线程10^5次操作?我的数字来自Intel的线程构建块文档的旧版本。根据我的经验,它感觉很好,你需要相当多的工作周期才能使用threading@HighPerformanceMark我没有测量任何东西,我只是运行了一些简单的真实世界测试(TM),根据我使用pthreads的经验,我预计最多只会有一点损失,并且对这些巨大的损失感到非常困惑,以至于我真的认为我做错了什么。我瞥了一眼libgomp,发现了大量开销的很多原因,特别是巨大的安全网,它吃了很多东西。但是用pthreads手工实现这个东西是复杂、乏味和容易出错的,所以OpenMP绝对值得一试。
real    0m8.025s
user    0m14.936s
sys 0m0.060s
real    0m14.198s
user    0m48.224s
sys 0m0.109s