考虑到当今多核和多处理硬件的巨大重要性,试图掌握当前人们实际编写并行代码的方式.对我来说,看起来主流范式是pthreads(POSIX线程),它在Linux上是原生的,可在Windows上使用.HPC人员倾向于使用OpenMP或MPI,但似乎StackOverflow上没有这些.或者你依靠Java线程,Windows线程API等而不是便携式标准?在您看来,建议的并行编程方式是什么?
或者你正在使用更多异国情调的东西,如Erlang,CUDA,RapidMind,CodePlay,Oz,甚至是亲爱的老奥卡姆?
澄清:我正在寻找非常便携的解决方案,适用于各种主机架构上的Linux,各种unix等平台.Windows是一种罕见的案例,非常适合支持.所以C#和.net在这里真的太狭隘,CLR是一个很酷的技术,但是他们可以为Linux主机发布它,这样它就像JVM,Python,Erlang或任何其他可移植语言一样普遍.
基于C++或JVM:可能是C++,因为JVM往往会隐藏性能.
MPI:我同意甚至HPC人员都认为它是一种难以使用的工具 - 但是对于在128000处理器上运行,它是解决map/reduce不适用的问题的唯一可扩展解决方案.但是,消息传递非常优雅,因为它是唯一可以很好地扩展到本地内存/ AMP,共享内存/ SMP,分布式运行时环境的编程风格.
一个有趣的新竞争者是MCAPI.但我认为没有人有时间对此有任何实际经验.
总的来说,情况似乎是有许多我不了解的有趣的微软项目,而且Windows API或pthreads是实践中最常见的实现.
我在使用cuda理解NVIDIA gpu架构中的线程时遇到了一些麻烦.
请任何人澄清这些信息:一个8800 gpu有16个SM,每个有8个SP.所以我们有128个SP.
我正在观看斯坦福的视频演示,并且说每个SP都能够在当前运行96个线程.这是否意味着它(SP)可以同时运行96/32 = 3个warp?
此外,由于每个SP可以运行96个线程,并且每个SM都有8个SP.这是否意味着每个SM可以同时运行96*8 = 768个线程?但是如果每个SM一次只能运行一个Block,并且一个块中的最大线程数是512,那么同时运行768个线程并且最多有512个线程的目的是什么?
一个更普遍的问题是:如何将块,线程和warp分配给SM和SP?我读到每个SM一次只能执行一个块,块中的线程被分成warp(32个线程),SP执行warp.
据我所知,处理器中的多核架构不会影响程序.实际的指令执行在较低层处理.
我的问题是,
鉴于您拥有多核环境,我是否可以使用任何编程实践来更有效地利用可用资源?我应该如何更改代码以在多核环境中获得更高的性能?
hardware parallel-processing programming-languages multicore processor
我一直在使用C#,并且最近开始致力于为我的侧面项目添加并行性.因此,根据微软的说法,读取和写入int甚至浮点数都是原子的
我确信这些原子性要求在x86架构上运行得很好.但是,在ARM(可能没有硬件浮点支持)等体系结构上,似乎这些保证很难.
问题只是因为'int'总是32位而变得更加重要.有许多嵌入式设备无法自动执行32位写入.
这似乎是C#中的一个根本错误.保证这些数据类型的原子性不能轻松完成.
这些原子性保证如何在没有FPU或32位写入的架构上实现?
澄清:根据一些评论,我应该澄清这是一个简单的框架,允许执行自然并行的程序(所谓的令人尴尬的并行程序).它不是,也永远不会是需要在进程之间进行通信或同步的任务的解决方案.
我一直在寻找一个简单的基于流程的并行编程环境,它可以在Python上的多个CPU上执行函数,主要标准是它需要能够执行未经修改的Python代码.我发现最接近的是Parallel Python,但是pp会做一些非常时髦的事情,这会导致代码无法在正确的上下文中执行(导入适当的模块等).
我终于厌倦了搜索,所以我决定写自己的.我想出的其实很简单.问题是,我不确定我提出的内容是否简单,因为我没有想到很多事情.这是我的程序的作用:
通过传递如下所示的字典,将作业分发给侦听节点的服务器:
{
'moduleName':'some_module',
'funcName':'someFunction',
'localVars': {'someVar':someVal,...},
'globalVars':{'someOtherVar':someOtherVal,...},
'modulePath':'/a/path/to/a/directory',
'customPathHasPriority':aBoolean,
'args':(arg1,arg2,...),
'kwargs':{'kw1':val1, 'kw2':val2,...}
}
Run Code Online (Sandbox Code Playgroud)moduleName并且funcName是强制性的,其他是可选的.
节点服务器接受此字典并执行:
sys.path.append(modulePath)
globals()[moduleName]=__import__(moduleName, localVars, globalVars)
returnVal = globals()[moduleName].__dict__[funcName](*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)在获取返回值时,服务器然后将其发送回作业服务器,该服务器将其放入线程安全队列中.
我确信有一些需要解决的问题,但这种方法有什么明显的错误吗?乍一看,它似乎很健壮,只需要节点可以访问包含.py文件和依赖项的文件系统.使用__import__的优点是模块中的代码是自动运行的,因此函数应该在正确的上下文中执行.
任何建议或批评将不胜感激.
编辑:我应该提到我已经有代码执行位工作,但服务器和作业服务器尚未编写.
我正在编写一个Windows服务来使用MSMQ消息.该服务将具有高活动时段(80k消息很快进入)和长时间不活动(可能是几天没有新消息).
处理消息是非常网络限制的,所以我从并行性中获得了很大的好处.但是在不活动期间,我不希望绑定一堆线程来等待很快就会收到的消息.
MSMQ界面似乎非常关注同步工作流 - 获取一条消息,处理它,获取另一条消息等等.我应该如何构建我的代码,以便在高活动期间我可以利用并行性但不会占用一堆没有活动期间的线程?使用TPL的奖励积分.伪代码将不胜感激.
我有一个问题,我想拆分多个CUDA设备,但我怀疑我当前的系统架构阻碍了我;
我设置的是一个GPU类,其功能可以在GPU上执行操作(奇怪的是).这些操作都是这种风格
for iteration in range(maxval):
result[iteration]=gpuinstance.gpufunction(arguments,iteration)
Run Code Online (Sandbox Code Playgroud)
我想象N个设备会有N个gpuinstances,但是我对多处理没有足够的了解,看看应用这个的最简单的方法,以便每个设备都被异步分配,奇怪的是我遇到的几个例子给了处理后整理结果的具体演示.
任何人都可以在这方面给我任何指示吗?
更新 感谢Kaloyan在多处理领域的指导; 如果CUDA不是特定的关键点我会标记你的回答.抱歉.
实际上,为了使用这个实现,gpuinstance类启动了CUDA设备import pycuda.autoinit但是看起来不起作用,invalid context一旦每个(正确范围的)线程遇到cuda命令就抛出错误.然后我尝试__init__在类的构造函数中手动初始化...
pycuda.driver.init()
self.mydev=pycuda.driver.Device(devid) #this is passed at instantiation of class
self.ctx=self.mydev.make_context()
self.ctx.push()
Run Code Online (Sandbox Code Playgroud)
我的假设是在创建的gpuinstance列表和线程使用它们之间保留上下文,因此每个设备都位于自己的上下文中.
(我还实现了一个析构函数来处理pop/detach清理)
问题是,invalid context一旦线程试图触摸CUDA ,异常仍然出现.
有什么想法吗?并且感谢这么远.为在他们的答案中工作'香蕉'的人自动投票!:P
Scala中与Future相关的类和特性之间的联系是什么,为什么它们被分散在不同的包中?
我找到了那些:
abstract class scala.actors.Future
object scala.actors.Futures
trait/object scala.collection.parallel.FutureThreadPoolTasks
trait scala.concurrent.FutureTaskRunner
trait scala.parallel.Future (the package consists of only this file...)
Run Code Online (Sandbox Code Playgroud)
他们有显着不同的东西,还是有其他原因导致他们无法巩固?
是否有一个很好的例子显示何时会使用这一个或另一个?
编辑: Bounty用于解释每个类/特征/对象的作用以及它们如何证明它们的存在/它们如何有用.
我查看了大量的文档并完成了大量的Google搜索,但无法找到以下问题的答案:有没有办法在foreach使用该foreach包的并行循环中引入"类似下一个"的功能?
具体来说,我想做一些事情(这不起作用,next但没有):
foreach(i = 1:10, .combine = "c") %dopar% {
n <- i + floor(runif(1, 0, 9))
if (n %% 3) {next}
n
}
Run Code Online (Sandbox Code Playgroud)
我意识到我可以嵌套我的括号,但如果我想在一个长循环中有一些下一个条件,这很快就会变成语法噩梦.
这里有一个简单的解决方法(下一个类似的功能或不同的方法来解决问题)?
我根本没有在Clojure中使用多线程,所以不确定从哪里开始.
我doseq的身体可以并行运行.我想要的是总是有3个线程运行(留下1个核心空闲),并行地评估主体直到范围耗尽.没有共享状态,没有什么复杂的 - 相当于Python的多处理就可以了.
所以类似于:
(dopar 3 [i (range 100)]
; repeated 100 times in 3 parallel threads...
...)
Run Code Online (Sandbox Code Playgroud)
我应该从哪里开始寻找?有这个命令吗?标准包装?一个很好的参考?
到目前为止,我已经找到了pmap,并且可以使用它(我如何一次限制为3?看起来它一次使用32个 - 不,源说2 +处理器数量),但似乎这是一个基本原语应该已经存在于某处.
澄清:我真的想控制线程的数量.我有长时间运行的进程并使用相当数量的内存,所以创建一个大数字并希望事情正常运行OK不是一个好方法(例如使用重要的块可用内存).
更新:开始写一个执行此操作的宏,我需要一个信号量(或一个互斥量,或者我可以等待的原子).Clojure中是否存在信号量?或者我应该使用ThreadPoolExecutor?从Java中提取这么多内容似乎很奇怪 - 我认为Clojure中的并行编程应该很容易......也许我正在考虑这完全错误的方式?嗯.代理?