另一种思路,提供2个函数,一个是单线程的函数,一个是多线程的函数。
以计算机阶乘(双核)为例,说明一下。
1.任务 计算 n!
step 1,找出一个数m, 使得 m! 和(m+1)*(m+2)*..n大致具有相同的位数。
step 2. 创建2个线程,分别计算 x1= 1*2*3*4* ...m和 x2= (m+1)*(m+2)*...n
step 3. 等这两个线程运行完成,调用多线程乘法函数 计算 x= x1 * x2
容易看到,这个任务最耗时间的是step2, 其次是step3. 在step2中,计算累乘时,用到的是单线程函数。在step3中,计算乘法时用到的是多线程函数。 :)
提供两个函数不必要的
多核多线程函数必然要调用单线程函数
所以一个足够了
只要接口写的好
完全可以一函数对应两种情况 你没有明白我的意思。
我说的多线程函数是指这个函数在工作的时候,启动多个线程,同时计算。
如果当前没有别的事情可做,单线程函数不能充分发挥利用系统的资源,速度很慢。而 多线程函数 则启动多个线程,线程之间互相协作,同时计算。 我觉得还是将基本运算切分成多线程比较好,
它们的提速将是对算法库的整体贡献。
比如若基本的 + - * 速度上来了,除法效率自然而然的上来了,
进而其它的乘方、开方等运算也提速了,甚至大数的模幂计算也提速了。
如果在外围设计多线程,则非常麻烦,也非常不安全,
因为有些算法之前有相互调用,则线程总数无法控制。 我是觉得如将多线程放到底层来做,则线程间的同步,线程切换的开销很大。影响整体性能的发挥。另外,基本的运算都用多线程来做,将使得基本运算函数的编写和调试很困难,风险较大。 所以这一块需要非常精巧的设计,
当前已发布的 HugeCalc 虽然仅完成了乘法对多核的部分支持,在多核CPU上提速已非常明显。
因为大数运算调用次数最多的还是那几个基本的 + - * 运算,其它的仅是其外围包装,
核心强则算法库强! 最核心的是可以线程无关的 最核心的当然是不与线程相关的,比如内存分配等都在调多线程前做好,并保证可完全独立并行。
比如10000位数*100位数(这里的“位”非bit),四核机器,
则切分成4个25000*100位数的乘法,每个需要分配25000+100位的空间,
虽然总空间 (25000+100)*4 > 10000+100,但却因充分并行而节省了时间。 :Q:
在大数运算超过一定规模后
实际问题基本上都是长度差不多的乘法
======================
很少遇到长度差别大的乘法的
页:
1
[2]