找回密码
 欢迎注册
楼主: 无心人

[讨论] 似乎,好像,大概,可能

[复制链接]
发表于 2008-10-15 12:06:40 | 显示全部楼层
我的想法和无心人同,多核(多线程)在上层实现。

  另一种思路,提供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中,计算乘法时用到的是多线程函数。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-10-15 13:49:00 | 显示全部楼层


提供两个函数不必要的
多核多线程函数必然要调用单线程函数
所以一个足够了

只要接口写的好
完全可以一函数对应两种情况
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-15 17:48:18 | 显示全部楼层
你没有明白我的意思。
我说的多线程函数是指这个函数在工作的时候,启动多个线程,同时计算。
如果当前没有别的事情可做,单线程函数不能充分发挥利用系统的资源,速度很慢。而 多线程函数 则启动多个线程,线程之间互相协作,同时计算。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-15 20:19:33 | 显示全部楼层
我觉得还是将基本运算切分成多线程比较好,
它们的提速将是对算法库的整体贡献。

比如若基本的 + - * 速度上来了,除法效率自然而然的上来了,
进而其它的乘方、开方等运算也提速了,甚至大数的模幂计算也提速了。

如果在外围设计多线程,则非常麻烦,也非常不安全,
因为有些算法之前有相互调用,则线程总数无法控制。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-15 20:53:45 | 显示全部楼层
我是觉得如将多线程放到底层来做,则线程间的同步,线程切换的开销很大。影响整体性能的发挥。另外,基本的运算都用多线程来做,将使得基本运算函数的编写和调试很困难,风险较大。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-15 21:16:37 | 显示全部楼层
所以这一块需要非常精巧的设计,
当前已发布的 HugeCalc 虽然仅完成了乘法对多核的部分支持,在多核CPU上提速已非常明显。
因为大数运算调用次数最多的还是那几个基本的 + - * 运算,其它的仅是其外围包装,
核心强则算法库强!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-10-15 21:27:45 | 显示全部楼层
最核心的是可以线程无关的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-15 22:02:17 | 显示全部楼层
最核心的当然是不与线程相关的,比如内存分配等都在调多线程前做好,并保证可完全独立并行。

比如10000位数*100位数(这里的“位”非bit),四核机器,
则切分成4个25000*100位数的乘法,每个需要分配25000+100位的空间,
虽然总空间 (25000+100)*4 > 10000+100,但却因充分并行而节省了时间。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-10-16 08:04:43 | 显示全部楼层


在大数运算超过一定规模后
实际问题基本上都是长度差不多的乘法
======================
很少遇到长度差别大的乘法的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-2 12:39 , Processed in 0.041940 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表