我有一台运行Windows XP的四核笔记本电脑,但是看看任务管理器R似乎一次只能使用一个处理器.如何让R使用所有四个处理器并加速我的R程序?
我试图理解为什么我们需要标准示例代码的所有部分:
a `par` b `pseq` a+b
Run Code Online (Sandbox Code Playgroud)
以下为什么不够?
a `par` b `par` a+b
Run Code Online (Sandbox Code Playgroud)
上述表达式似乎很描述:尝试同时评估a和b并行,并返回结果a+b.仅仅是效率的原因:第二个版本会引发两次而不是一次?
以下,更简洁的版本怎么样?
a `par` a+b
Run Code Online (Sandbox Code Playgroud)
为什么我们需要确保在原始标准代码b之前进行评估a+b?
我是这种编程的新手,需要你的观点.
我必须构建一个应用程序,但我无法让它足够快地进行计算.我已经尝试过英特尔TBB,它很容易使用,但我从未使用过其他库.
在多处理器编程中,我正在阅读有关多线程的OpenMP和Boost,但我不知道它们的优缺点.
在C++中,与多处理器编程相比,何时多线程编程是有利的,反之亦然?哪个最适合于繁重的计算或启动许多任务......?当我们构建使用它们设计的应用程序时,它们的优缺点是什么?最后,哪个库最适合使用?
使用clojure我在序列中有非常大量的数据,我想并行处理它,核心数量相对较少(4到8).
最简单的方法是使用pmap而不是将map处理函数映射到数据序列上.但协调开销导致我的案件净亏损.
我认为原因是pmap假设跨数据映射的函数非常昂贵.查看pmap的源代码,它似乎future依次为序列的每个元素构造一个,因此函数的每次调用都发生在一个单独的线程上(在可用内核的数量上循环).
以下是pmap的相关部分:
(defn pmap
"Like map, except f is applied in parallel. Semi-lazy in that the
parallel computation stays ahead of the consumption, but doesn't
realize the entire result unless required. Only useful for
computationally intensive functions where the time of f dominates
the coordination overhead."
([f coll]
(let [n (+ 2 (.. Runtime getRuntime availableProcessors))
rets (map #(future (f %)) coll)
step (fn step [[x & …Run Code Online (Sandbox Code Playgroud) 我有一个C扩展,我想使用OpenMP.但是,当我导入我的模块时,出现导入错误:
ImportError: /home/.../_entropysplit.so: undefined symbol: GOMP_parallel_end
Run Code Online (Sandbox Code Playgroud)
我用-fopenmp和-lgomp编译了模块.这是因为我的Python安装没有用-fopenmp标志编译吗?我是否必须从源代码构建Python?还是有其他可能性吗?这是我在模块中实际使用openmp的唯一时间:
unsigned int feature_index;
#pragma omp parallel for
for (feature_index = 0; feature_index < num_features; feature_index++) {
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我想坚持使用openmp,因为它非常简单,并且在这种情况下并行化非常适合它.
编辑:我咬了一口气,用OpenMP支持重新编译了Python.我的模块现在完美运行,但这不是一个很好的解决方案.如果需要完全重新编译Python,我无法真正分发它.所以有人知道这方面的一些方法吗?或许ctypes会起作用吗?
解决了!这是一个简单的链接问题.(我为此重建了Python?!)在编译模块期间,OpenMP没有正确链接.因此,IS可以加载使用OpenMP的一个C Python扩展.
我最近在一次采访中被问到这个问题,虽然我在前两部分做得很好[我假设]我在第三部分上做了一些努力.这是问题:
您有两个Linux程序,A和B.当单独运行时,A和B每个都需要一分钟才能完成刚刚重新启动的系统.[即:新系统:重新启动它,登录,获取shell提示符,运行程序.]
如果有以下情况,您可以告诉我有关这些计划
a)一起跑,他们需要2分钟b)一起跑,他们需要1分钟c)一起跑,他们需要30秒
我说过:a)如果他们在一起运行时花费的时间恰好是两倍,他们就不会互相排斥,并且正在争夺所有相同的资源,可能不会共享任何类型的缓存数据或指令[因此没有帮助从缓存的角度来看彼此相对,并且每个程序需要完全利用所述资源来完成,使得OS不能并行化它们.
对于b),我说如果它们能够一起快速运行,它们可能在现金中共享一些空间/时间局部性,并且可以使得它们能够以这样的方式正确地流水线化,即当程序A在等待某些东西时,程序B可以在这些阶段之间运行,反之亦然 - 在1分钟内有效地运行它们.
对于c),我有点卡住了.回想起来,我可能应该说,也许程序A和B都在做一个共同的任务,其中两个同时运行可以比单独运行的任务更快地完成所述任务 - 例如垃圾收集器.但我能想到的最好的结果是它们可能是从硬盘上的同一扇区中加载出来的,这有助于它们一起快速运行.
我只是在寻找一些我可能错过的东西的一些聪明人的意见.这个位置是针对平台/系统的位置,需要很好地理解硬件/软件和操作系统,以及它们之间的相互作用,这就是为什么[我假设]问的问题.
我也试着想一些可以应用于每个部分的例子,以帮助展示我对现实生活应用程序的问题的知识,但当场我很简短.
我正在使用Android SDK 4.0.3 API15,我希望并行运行多个AsyncTasks.我从Web服务器获取数据并实时动画(10 fps).但是根据用户操作,我还需要将一些数据发送到Web服务器.当发生这种情况时,我的动画暂停一小段时间(发送数据进入队列并获取数据等待它完成)因此我无法捕捉实时.
这个答案很有说服力,但我无法使其发挥作用.所以任何帮助都将非常感激.
我想我需要使用这个功能来实现:
AsyncTask.executeOnExecutor(Executor exec, Params... params)
Run Code Online (Sandbox Code Playgroud)
但我无法将执行程序作为参数传递,我无法实例化执行程序.这是我的AsyncTask类:
public class GetPlayers extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
rawData="";
for (String url : urls) {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse execute = client.execute(httpGet);
InputStream content = execute.getEntity().getContent();
BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
if((rawData = buffer.readLine()) == null){
rawData = "error";
}
} catch (Exception e) {
e.printStackTrace();
}
}
return …Run Code Online (Sandbox Code Playgroud) 我将以下包装入R:
library(foreach)
library(doParallel)
library(iterators)
Run Code Online (Sandbox Code Playgroud)
我将代码"并行化"了很长时间,但最近我在代码运行时遇到INTERMITTENT停止.错误是:
Error in serialize(data, node$con) : error writing to connection
Run Code Online (Sandbox Code Playgroud)
我有根据的猜测是,我使用下面的命令打开的连接可能已过期:
## Register Cluster
##
cores<-8
cl <- makeCluster(cores)
registerDoParallel(cl)
Run Code Online (Sandbox Code Playgroud)
查看makeCluster手册页,我发现默认情况下,连接仅在30天后到期!我可以设置选项(错误=恢复),以便在代码停止时动态检查连接是否打开,但我之前决定发布这个一般性问题.
重要:
1)错误实际上是间歇性的,有时我重新运行相同的代码并且没有错误.2)我在同一台多核机器(Intel/8内核)上运行所有内容.因此,它不是群集中的通信(网络)问题.3)我是笔记本电脑和台式机(64核心)上CPU和GPU并行化的重要用户.不幸的是,这是我第一次遇到这种类型的错误.
是否有人有相同类型的错误?
根据要求,我提供了sessionInfo():
> sessionInfo()
R version 2.15.3 (2013-03-01)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252 LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] parallel stats graphics grDevices utils datasets methods base
other attached packages:
[1] TTR_0.22-0 xts_0.9-3 doParallel_1.0.1 iterators_1.0.6 foreach_1.4.0 zoo_1.7-9 Revobase_6.2.0 RevoMods_6.2.0
loaded via a namespace (and not …Run Code Online (Sandbox Code Playgroud) 我想在JS中做一些资源密集的任务.对于这个问题,我们假设它们是一些繁重的计算,而不是系统访问.现在我想同时运行任务A,B和C,并在完成后执行一些功能D.
该异步库为此提供了一个很好的脚手架:
async.parallel([A, B, C], D);
Run Code Online (Sandbox Code Playgroud)
如果我正在做的只是计算,那么它仍将同步运行(除非库将任务放在不同的线程上,我预计不是这种情况).我该如何让它实际上是平行的?通常由异步代码完成的事情是什么,以阻止调用者(使用NodeJS时)?它是否开始了儿童过程?
javascript parallel-processing multithreading asynchronous node.js
功能编程具有不可变的数据结构,并且没有副作用,这些本质上适用于并行编程.我研究了如何在函数式语言中利用多核计算,并针对某些数值应用程序设定生产代码.
F#背后有微软,它的并行结构如PLINQ,TPL,Async Workflow已被充分记录并显示出一些潜力.然而,关于Haskell中的并行性的研究目前非常活跃,并且它具有许多F#尚未支持的优秀特性:
我的问题是我应该选择哪种语言进行功能并行?如果选择了F#,是否有任何指针可以构建他们目前在Haskell中拥有的内容?
更新:
我选择了Simon的答案,因为它带来了关于垃圾收集器,内存分配和缓存未命中的一些很好的讨论.我会坚持使用F#,我认为这些答案对我学习功能并行是有帮助的.