一个CPU如何多张显卡实现并行计算算

新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
家境小康, 积分 1213, 距离下一级还需 787 积分
论坛徽章:0
如题,目前基本都是多核CPU,操作系统级别是否已经进行并行化?
我的理解是操作系统做了,自己在写程序时不用处理。
望高手解答一下。谢谢啦。
论坛徽章:2
linpay2000
操作系统自己的东西可以并行化,比如freebsd10要做的并行引导,并行设备侦测,比如linux里面的systemd并行引导。
并且可以自己或第三方提供部分并行化接口,比如opencl库等东西,这些提供基本的并行和异构处理能力
或者寻找并行平台,比如scale或者erlang,这些提供基本的并行处理原语
可是应用程序自己要并行处理,目前还是得靠自己,对一个程序需不需要并行,如何并行,会不会有资源竞争、死锁等基本问题都要论证半天,何况一个机器。
可用积分 +2
感谢解答 ^_^
巨富豪门, 积分 28280, 距离下一级还需 11720 积分
论坛徽章:29
那得分布式os吧
家境小康, 积分 1213, 距离下一级还需 787 积分
论坛徽章:0
谢谢解答,呵呵。
看来如果是写算法,如10万个变量做优化,这个并行优化就很有意义了。
对于带虚拟机的编程语言,如java/c#,能不能并行,还得看虚拟机吧。
再次感谢。
论坛徽章:2
linpay2000
更多的是看问题本身能不能并行处理,何种粒度并行等,现在的平台和语言支持都是习惯不习惯,上手快慢,参考资料多寡的问题。
论坛徽章:2
现在的平台不搞点并行支持,都不好意思说自己是个平台
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:22
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处没有更多推荐了,
不良信息举报
举报内容:
课程总结 -- CPU/GPU并行计算基础(CPU篇)
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!多cpu可以用于并行计算_中华文本库
abaqus并行计算效率问题_建筑/土木_工程科技_专业资料。ABAQUS 多处理器进行并行...只使用 Standard 的同学基本可以不用考虑买多 cpu 的机器 来自:likuiming 收集...
并行计算简介和多核CPU编程Demo_IT/计算机_专业资料。并行计算简介和多核 CPU 编程 Demo
tag:多线程,并行计算,OpenMP,多核编程...
1.3多核处理器中并行计算加速比分析. 一个算法使用多核的效果可以用加速比Sp—tl/tp(1) 最近几年,AMD和Intel公司推出了拥有大型 机品质的用于个人计算机的多...
ansys多cpu并行计算设置_计算机硬件及网络_IT/计算机_专业资料。关于 ansys 程序...转 simwe 9.很牛的机 器却出现内存不足错误 也许是求解器选择问题可以用 PCG...
还有一个天津的小老乡,虽然没有做过多节点的并行计 算,但是对于这方面很熟悉,...重新开始计算, 我观察了一下 CPU 的使用情况, 发现可以同时计算两个模型。 第...
GPU并行计算技术 多核CPU的应用模式是一个程序采用了线程级并行编程,程序在运行时可以把并行 的线程同时交付给多个核心分别处理,因而程序运行速度得到极...
过去是 没法实现的,现在有了多核CPU,在一个 最新的8核CPU上就可以实现了。 ...JAVA 语言实现了开源的部署于集群中的平台, 取名为Hadoop,用于集群下的并行计算...
ABAQUS多处理器进行并行计算的效果研究_IT/计算机_专业资料。环境: ABAQUS6.3+8...效果不明显,甚至可能使运算更慢,只使用Standard的同学基本可以不用考虑买多cpu的...
在Windows平台上使用多核CPU加速Fluent计算_计算机软件及应用_IT/计算机_专业资料...2. 启动并行版本的 Fluent Fluent 可以以多种方式启动并行版本, 这里只介绍在...
用于计算任务状态的机 器而言 ,可以给出下列结论 : ( 1 ) 对具有 n 核的 CPU , 采用 m 个线程并行计 算 , 则只 有当 m ≥ n 时 , CPU 的使用率...Posts - 610, Comments - 29787
最后还是忍不住翻译文章了。这系列的文章谈论的是F#中常见的异步及并行模式,作者为F#语言的主要设计者。异步相关的编程是F#语言中最重要的优势之一(我甚至在考虑“之一”两个字能否去掉)。F#是一门非常有特色的语言,是一门能够开阔眼界,改变您编程思路的语言,它经过了几年设计以及多个预览之后终于要正式露面了——此刻不上,更待何时。
F#是一门并行(parallel)及响应式(reactive)语言。这个说法意味着一个F#程序可以存在多个进行中的运算(如使用.NET线程进行F#计算),或是多个等待中的回应(如等待事件或消息的回调函数及代理对象)。
F#的异步表达式是简化异步及响应式程序编写的方式之一。在这篇及今后的文章中,我会探讨一些使用F#进行异步编程的基本方式──大致说来,它们都是F#异步编程时使用的模式。这里我假设您已经掌握了async的基本使用方式,如中的内容。
我们从两个简单的设计模式开始:CPU异步并行(Parallel CPU Asyncs)和I/O异步并行(Paralle I/O Asyncs)。
本系列的描述了如何从异步计算或后台计算单元中获得结果。
、)则描述了F#中轻量级的,响应式的,各自独立的代理对象。
模式1:CPU异步并行
首先来了解第一个模式:CPU异步并行,这意味着并行地开展一系列的CPU密集型计算。下面的代码计算的是斐波那契数列,它会将这些计算进行并行地调配:
let rec fib x = if x &= 2 then 1 else fib(x-1) + fib(x-2)
let fibs =
Async.Parallel [ for i in 0..40 -& async { return fib(i) } ]
|& Async.RunSynchronously
val fibs : int array =
[|1; 1; 2; 3; 5; 8; 13; 21; 34; 55; 89; 144; 233; 377; 610; 987; ;
; 1; 2; 7; 7811;
9; 27; 930352;
上面的代码展示了并行CPU异步计算模式的要素:
“async { … }”用于指定一系列的CPU任务。
这些任务使用进行fork-join式的组合。
在这里,我们使用方法来执行组合后的任务,这会启动一个异步任务,并同步地等待其最后结果。您可以使用这个模式来完成各种CPU并行(例如对矩阵乘法进行划分和并行计算)或是批量处理任务。
模式2:I/O异步并行
现在我们已经展示了在F#中进行CPU密集型并行编程的方式。F#异步编程的重点之一,便是可以用相同的方式进行CPU和I/O密集型的计算。这便是我们的第二种模式:I/O异步并行,即同时开展多个I/O操作(也被称为overlapped I/O)。例如下面的代码便并行地请求多个Web页面,并响应每个请求的回复,再返回收集到的结果。
open System
open System.Net
open Microsoft.FSharp.Control.WebExtensions
let http url =
async { let req =
WebRequest.Create(Uri url)
use! resp = req.AsyncGetResponse()
use stream = resp.GetResponseStream()
use reader = new StreamReader(stream)
let contents = reader.ReadToEnd()
return contents }
let sites = [&http://www.bing.com&;
&http://www.google.com&;
&http://www.yahoo.com&;
&http://www.search.com&]
let htmlOfSites =
Async.Parallel [for site in sites -& http site ]
|& Async.RunSynchronously
上面的代码示例展示了I/O异步并行模式的基础:
“async { … }”用于编写任务,其中包含了一些异步I/O。
这些任务使用Async.Parallel进行fork-join式的组合。
在这里,我们使用方法来执行组合后的任务,这会启动一个异步任务,并同步地等待其最后结果。
使用let!(或与它类似的资源释放指令use!)是进行异步操作的基础方法。例如:
let! resp = req.AsyncGetResponse()
上面这行代码会“响应”一个HTTP GET操作所得到的回复,即async { … }在AsyncGetResponse操作完成之后的部分。然而,在等待响应的过程中并不会阻塞任何.NET或操作系统的线程:只有活动的CPU密集型运算会使用下层的.NET或操作系统线程。与此不同,等待中的响应操作(例如回调函数,事件处理程序和代理对象)资源占用非常少,几乎只相当于一个注册好的对象而已。因此,您可以同时拥有数千个甚至数百万个等待中的响应操作。例如,一个典型的GUI应用程序会注册一些事件处理程序,而一个典型Web爬虫会为每个发出的请求注册一个回调函数。
在上面的代码中,我们使用了“use!”而不是“let!”,这表示Web请求相关的资源会在变量超出字面的作用域之后得到释放。
I/O并行的美妙之处在于其伸缩性。在多核的环境下,如果您可以充分利用计算资源,则通常会获得2倍、4倍甚至8倍的性能提高。而在I/O并行编程中,您可以同时进行成百上千的I/O操作(不过实际的并行效果还要取决于您的操作系统和网络连接状况),这意味着10倍、100倍、1000倍甚至更多的性能增强──而这一切在一台单核的机器上也可以实现。例如,这里有一个,而最终它们可以在一个IronPython应用程序中使用。
许多现代应用程序都是I/O密集型应用,因此这些设计模式在实践中都有很重要的意义。
始于GUI线程,终于GUI线程
这两个设计模式有个重要的变化,这便是使用来代替方法。在一个并行操作开启之后,您可以指定三个函数,分别在它成功、失败或取消时调用。
对于诸如“我想要获得一个异步操作的结果,但我不能使用RunSynchronously方法”之类的问题,您便应该考虑:
使用let!(或use!)把这个异步操作作为更大的异步任务的一部分,或者
使用Async.StartWithContinuations方法执行异步操作
在那些需要在GUI线程上发起异步操作的场景中,方法尤其有用。因为,您不会因此阻塞住GUI线程,而且可以在异步操作完成后直接进行GUI的更新。例如,在的示例中便使用了这个做法──您可以在本文结尾浏览它的完整代码,不过这里最值得关注的部分则是在点击“Translate”按钮之后发生的事情:
button.Click.Add(fun args -&
let text = textBox.Text
translated.Text &- &Translating...&
let task =
async { let! languages = httpLines languageUri
let! fromLang = detectLanguage text
let! results = Async.Parallel [for lang in languages -& translateText (text, fromLang, lang)]
return (fromLang,results) }
Async.StartWithContinuations(
(fun (fromLang,results) -&
for (toLang, translatedText) in results do
translated.Text &- translated.Text + sprintf &\r\n%s --& %s: \&%s\&& fromLang toLang translatedText),
(fun exn -& MessageBox.Show(sprintf &An error occurred: %A& exn) |& ignore),
(fun cxn -& MessageBox.Show(sprintf &A cancellation error ocurred: %A& cxn) |& ignore)))
高亮的部分,尤其是在async块里的部分,展示了使用Async.Parallel将一种语言并行地翻译成多种语言的做法。这个异步组合操作由Async.StartWithContinuations发起,它会在遇到第一个I/O操作时立即返回(译注:存疑,为什么是在遇上I/O操作才返回?),并指定了三个函数,分别在异步操作的成功,失败或取消时调用。以下是任务完成后的截图(不过在此不保证翻译的准确性……):
Async.StartWithContinuations有一个重要的特性:如果异步操作由GUI线程发起(例如一个SynchronizationContext.Current不为null的线程),那么操作完成后的回调函数也是在GUI线程中调用的。这使GUI更新操作变的十分安全。F#异步类库允许您组合多个I/O任务,并在GUI线程中直接使用,而无需您亲自从后台线程中更新GUI元素。在以后的文章中我们会进行更详细地解释。
关于Async.Parallel工作方式:
在执行时,由Async.Parallel组合而成的异步操作会通过一个等待计算的队列来逐步发起。与大部分进行异步处理的类库一样,它在内部使用的是QueueUserWorkItem方法。当然,我们也有办法使用分离的队列,在以后的文章中我们会进行一些讨论。
Async.Parallel方法并没有什么神奇之处,您也完全可以使用Microsoft.FSharp.Control.Async类库中的其他原语来定义您自己的异步组合方式──例如Async.StartChild方法。我们会在以后的文章中讨论这个话题。
在包含多个使用这些模式的示例代码:
BingTranslator.fsx与BingTranslatorShort.fsx:使用F#调用REST API,它们与其他基于Web的HTTP服务的调用方式十分类似。文末包含了示例的完整代码。
AsyncImages.fsx:并行磁盘I/O及图像处理。
PeriodicTable.fsx:调用一个Web服务,并行地获取原子质量。
本文模式的限制
上文介绍的两个并行模式有一些限制。很明显,使用Async.Parallel生成的异步操作在执行时十分“安静”──比方说,它们无法返回进度或部分的结果。为此,我们需要构建一个更为“丰富”的对象,它会在部分操作完成之后触发一些事件。在以后的文章中我们会来关注这样的设计模式。
此外,Async.Parallel只能处理固定数量的任务。在以后的文章中,我们会遇到很多一边处理一边生成任务的情况。换个方式来看,即Async.Parallel无法处理即时获得的消息──例如,除了取消任务之外,一个代理对象的工作进度是可以得到控制的。
CPU异步并行与I/O异步并行,是F#异步编程中最为简单的两种设计模式,而简单的事物往往也是非常重要而强大的。请注意,两种模式的不同之处,仅仅在于I/O并行使用了包含了I/O请求的async块,以及一些额外的CPU任务,如创建请求对象及后续处理。
在今后的文章里,我们会关注F#中其他一些并行及响应式编程方面的设计方式,包括:
从GUI线程中发起异步操作
定义轻量级异步代理对象
使用async定义后台工作程序
使用async构建.NET任务
使用async调用.NET的APM模式
取消异步操作
BingTranslator代码示例
以下是BingTranslator的示例代码,在运行时您需要申请一个。请注意,这个示例需要根据进行适当调整,至少在2.0中已经不包含这里的语言检测API了──不过这些代码仍然是不错的示例:
Categories:
,登陆后便可删除或修改已发表的评论
(请注意保留评论内容)51CTO旗下网站
CPU多核并行
:《GPU高效能运算之CUDA》介绍使用CUDA进行通用计算所需要的语法、硬件架构、程序优化技巧等知识,是进行GPU通用计算程序开发的入门教材和参考书。第1章介绍GPU通用计算的发展历程,介绍并行计算的历史、现状以及面临的问题。本节说的是CPU多核并行。
作者:张舒 褚艳利来源:中国水利水电出版社| 09:06
1.1.1& CPU多核并行
过去20年间,Intel、AMD等厂家推出的CPU性能在不断提高,但发展速度与20世纪80年代末90年代初的飞跃相比,已经不能相提并论。按照摩尔定律,每18~24个月芯片上可集成的晶体管数量就会翻倍,这一速度带来了处理能力和速度的飞速增长。
CPU提高单个核心性能的主要手段是提高处理器的工作频率,以及增加指令级并行。这两种传统的手段都遇到了问题:随着制造工艺的不断提高,晶体管的尺寸越来越接近原子的数量级,漏电流问题愈加显著,单位尺寸上的能耗和发热也越来越大,使得处理器的频率提高速度越来越慢。另一方面,通用计算中的指令级并行并不多,因此费尽苦心设计获得的性能提高与投入的大量晶体管相比,显得很不划算。使用流水线可以提高指令级并行,但更多更深的流水线可能会导致效率问题,例如,Intel的Pentium 4架构中有更长的流水线,但运算性能还不及同频的Pentium Ⅲ。为了实现更高的指令级并行,就必须用复杂的猜测执行机制和大块的缓存保证指令和数据的命中率。现代CPU的分支预测正确率已经达到了99%以上,没有什么提高余地。缓存的大小对CPU的性能有很大影响,过去低端的赛扬和主流的奔腾处理器用于计算的单元基本一样,主要区别就在于缓存的大小。但是继续增加缓存大小,最多也就是让真正用于计算的少量执行单元满负荷运行,这显然无助于CPU性能的进一步提高。
由于上述原因限制了单核CPU性能的进一步提高,CPU厂商开始在单块芯片内集成更多的处理器核心,使CPU向多核方向发展。2005年,Intel和AMD正式向主流消费市场推出了双核CPU产品,2007年推出4核CPU,2009年Intel CPU进入8核时代,Intel CPU核心数量及制程的变化如图1-3所示。随着多核CPU的普及,现代的普通PC都拥有数个CPU核心,实际上已经相当于一个小型集群。可以预见,未来CPU中的核心数量还将进一步增长。与此同时,多核架构对传统的系统结构也提出了新的挑战,如存储器壁垒、芯片、板极、系统级均衡设计以及可移植性等方面的问题。
随着CPU从单核发展为多核,越来越多的程序员也意识到了多线程编程的重要性。多线程编程既可以在多个CPU核心间实现线程级并行,也可以通过超线程等技术更好地利用每一个核心内的资源,充分利用CPU的计算能力。除了直接使用操作系统提供的线程管理API实现多线程外,还可以通过一些库或者语言扩展等方法实现多线程并行计算。目前常见的多线程编程语言扩展有OpenMP和Intel的TBB(Thread Building Block)等。
表1-1& 计算机的Flynn分类
【责任编辑: TEL:(010)】&&&&&&
大家都在看猜你喜欢
热点热点头条头条热点
24H热文一周话题本月最赞
讲师:30863人学习过
讲师:112718人学习过
讲师:91988人学习过
精选博文论坛热帖下载排行
本书是关于Spring 2.0的权威教程,是Java/Java EE开发者必备的参考书。本书详尽系统地介绍了Java EE的基础知识、Spring 2.0的各种功能,以...
订阅51CTO邮刊

我要回帖

更多关于 python实现并行计算 的文章

 

随机推荐