您的位置:首页 > 编程语言 > C#

一个关于局域网中【并行计算】的问题

2010-11-18 21:50 232 查看
我正在用C#做一个分布式计算的项目,最近刚做好,能完成基本功能。
有很多的数据不同,但运算相同的可以并发的运算,其中包括两种运算,第一种大概需要300~500毫秒,第二种大概需要50~100毫秒,两种运算有相关性,也就是说 只有完成第一种运算才能开始第二种。
在局域网(好像是千兆吧,公司里的)中用TCP/IP协议传输协议(C#里的socket, stream type),用XML格式序列化对象,
在相同的数据量和相同的运算量的情况下,
这样的结果正常吗?如果有问题,可能会在哪里出问题呢?
我明天去试试用更大的数据量和运算量测一测试试,可能会更说明问题。
希望能做成一个scalable的,就是在一个足够大的数据量和运算量的情况下,随着#机器变多,总运算时间会相应的减少。简单说就是多了10台机器,能看到多了10台机器的效果,多了100台,就能看到多了100台的效果。还有一点是,单次运算的时间近期内不会有太大的提高了,只是运算次数会变得越来越多。
看起来很正常(机器增加时间有缩短),任务调度本来就有成本。
可以多用不同的分布式计算框架来测试。
那减少的不是有点儿太少了吗???
如果1个是50秒,那两个就算不可能到25秒,但是也得到35秒左右吧

少传数据多运算就好,另外需要找到好的分解及聚合运算的方法(Mapreduce的核心思想)

如果少传数据的会增加响应时间,多做运算的话,总时间是会少一些(是很少,总时间能节省少于5秒钟(一共一分钟左右),我试过),但是单个任务的响应时间就会延长了。而且限制了最大化的在多机器上发生并发。
比方说,一个job中有很多tasks,如果一次发给一台电脑一个task,这样就会提高单个任务的响应速度,但增加了通信次数,如果一次发给一台电脑n个tasks一起处理,这样虽然减少了通信次数,但是单个任务响应时间就会增加n倍的时间。这中间比例不好掌握。。。
有什么方法可以动态的算出来这个分配任务的比例吗?
一次发送多少任务最适合。已知有n台机器,xMB/s的通信速度,任务的数量(几百~几千)和每个任务大概需要的时间。
例如:在千兆局域网中,TCP/IP连接的情况下,每个任务大概需要300ms完成,一个任务大概有几十KB大小,但是如果任务对象中附加了所需要的资源(例如,图片,声音,我现在做的例子是分析图片的,以后会有视频),任务就会增加到几MB,如果之前传给过目的机器当前任务所需要的资源了,就不用再传了。
(这样确实能节省很多时间,少传了好几十MB呢。现在已经实现这个了。)

资源文件分布在不同的机器上,这样会更加合理一些。动态分配任务会让程序逻辑变得更复杂,动态分配资源,相对简单。
为什么你做的传输这么的慢,我一秒钟要传输1800万个字节,约为17M。这个对于千兆网口是一点挑战都没有的。光硬盘的突发速度峰值都可以达到70多M/S。
我们所做的并不是像你说的那种分布式,我们是将硬件串联起来,第一个读取它应该读取的数据后继续下发数据,等所有数据都发送完毕之后,发送同步命令,同时显示。返回中断告诉PCI可以重新写数据。按道理说所需时间应该比你的还长

我说的仅是皮毛,LZ如果想深入研究的话,建议仔细研读Google关于Mapreduce的论文,里面也介绍了Google自己的一些构架和方法

本人是C#菜鸟,在学校学过一点点JAVA和C,谢谢支持,多多关照

来源:nba直播
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息