我有一个C shell脚本,它执行以下操作:
#!/bin/csh
gcc example.c -o ex
gcc combine.c -o combine
ex file1 r1 <-- 1
ex file2 r2 <-- 2
ex file3 r3 <-- 3
#... many more like the above
combine r1 r2 r3 final
\rm r1 r2 r3
Run Code Online (Sandbox Code Playgroud)
有一些办法可以让线1,2并3在运行并行而不是一个接另一个?
我正在尝试使用foreach在R中进行多核计算.
A <-function(....) {
foreach(i=1:10) %dopar% {
B()
}
}
Run Code Online (Sandbox Code Playgroud)
然后我A在控制台中调用函数.问题是我调用一个函数Posdef内B只在其它脚本文件我源中定义.我不得不把Posdef输出参数列表放在foreach:.export=c("Posdef").但是我收到以下错误:
Error in { : task 3 failed - "could not find function "Posdef""
Run Code Online (Sandbox Code Playgroud)
为什么不能找到这个定义的函数?
我一直在寻找新的Scala 2.9并行系列,我希望放弃一大堆类似东西的狡猾的业余版本.特别是,我想用自己的东西替换默认实现基础的fork join pool(例如,通过actor分配网络任务评估的东西).我的理解是,这只是应用Scala的"可堆叠修改"范式的问题,但是集合库非常令人生畏,我不确定哪些位需要修改!
一些具体问题:
ForkJoinTasks?FutureThreadPoolTasks.我如何构建一个使用这个特性的集合而不是ForkJoinTasks?AdaptiveWorkStealingTasks并以某种方式实例化使用这个新特征的集合实例?(作为参考,上面提到的所有特征都在Tasks.scala中定义.)
特别是代码示例非常受欢迎!
我正在构建一个大型的ParallelTable,并且想要了解计算的进展情况.对于非并行表,以下代码可以很好地完成:
counter = 1;
Timing[
Monitor[
Table[
counter++
, {n, 10^6}];
, ProgressIndicator[counter, {0, 10^6}]
]
]
Run Code Online (Sandbox Code Playgroud)
结果{0.943512, Null}.但是,对于并行情况,有必要counter在内核之间进行共享:
counter = 1;
SetSharedVariable[counter];
Timing[
Monitor[
ParallelTable[
counter++
, {n, 10^4}];
, ProgressIndicator[counter, {0, 10^4}]
]
]
Run Code Online (Sandbox Code Playgroud)
结果{6.33388, Null}.由于counter需要在每次更新时在内核之间来回传递值,因此性能损失将非常严重.有关如何了解计算方法的任何想法?也许让每个内核都有自己的值counter并且每隔一段时间对它们求和?也许某种方法可以确定表中哪些元素已经被内核修复了?
当使用cabal install类似于GNU make的-jN标志时,有没有办法并行编译包?
我感到困惑,因为异步编程是一种异步执行代码块的方法,它调用方法而不等待结果.同样,并行编程是一种同时执行多个任务的方法,但所有这些任务都是异步执行的.所以想知道/混淆c#中这两种编程范式之间的关系是什么.
注意:我已经在另一个SO帖子中解决了这个问题 - 在嵌套的Java 8并行流动作中使用信号量可能是DEADLOCK.这是一个错误吗? - 但是这篇文章的标题表明问题与使用信号量有关 - 这有点分散了讨论的注意力.我正在创建这个,以强调嵌套循环可能有性能问题 - 虽然这两个问题可能是一个共同的原因(也许是因为我花了很多时间来弄清楚这个问题).(我不认为它是重复的,因为它强调另一种症状 - 但如果你只是删除它).
问题:如果嵌套两个Java 8 stream.parallel().forEach循环并且所有任务都是独立的,无状态的等等 - 除了提交到公共FJ池 - 然后在并行循环内嵌套并行循环执行得更差而不是在并行循环内嵌套顺序循环.更糟糕的是:如果同步包含内循环的操作,您将获得DEADLOCK.
演示性能问题
如果没有"同步",您仍然可以观察到性能问题.您可以在以下网址找到演示代码:http://svn.finmath.net/finmath%20experiments/trunk/src/net/finmath/experiments/concurrency/NestedParallelForEachTest.java (有关更详细的说明,请参阅JavaDoc).
我们的设置如下:我们有一个嵌套的stream.parallel().forEach().
现在:将24个外循环任务提交给具有并行性的池8我们期望24/8*11 =最多33秒(在8核或更好的机器上).
结果是:
问题:你能证实这种行为吗?这是人们对框架的期望吗?(我现在更加小心,声称这是一个错误,但我个人认为这是由于ForkJoinTask的实现中的一个错误.备注:我已将此发布到并发兴趣(请参阅http:// cs.oswego.edu/pipermail/concurrency-interest/2014-May/012652.html),但到目前为止我没有得到确认).
证明了僵局
以下代码将为DEADLOCK
// Outer loop
IntStream.range(0,numberOfTasksInOuterLoop).parallel().forEach(i -> {
doWork();
synchronized(this) {
// Inner loop
IntStream.range(0,numberOfTasksInInnerLoop).parallel().forEach(j -> {
doWork();
});
}
});
Run Code Online (Sandbox Code Playgroud)
其中numberOfTasksInOuterLoop = 24,numberOfTasksInInnerLoop = 240,outerLoopOverheadFactor = 10000和 …
这是我的代码.循环中的东西是有道理的.
library(foreach)
library(doParallel)
cl <- makeCluster(7)
registerDoParallel(cl)
elasticitylist = foreach(i=1:nhousehold) %dopar% {
pricedraws = out$betadraw[i,12,]
elasticitydraws[,,i]= probarray[,,i] %*% diag(pricedraws)
elasticitydraws[,,i] = elasticitydraws[,,i] * as.vector(medianpricemat)
}
Run Code Online (Sandbox Code Playgroud)
我一直收到这个错误:
Error in serialize(data, node$con) : error writing to connection
Run Code Online (Sandbox Code Playgroud)
我知道我有足够的核心(有20个).有人能帮忙吗?似乎答案无处可在文档中找到!
当我ps -ef| grep user在我的unix服务器上运行时,我得到:
/apps/R.3.1.2/lib64/R/bin/exec/R --slave --no-restore -e parallel:::.slaveRSOCK() --args MASTER=localhost PORT=11025 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE
Run Code Online (Sandbox Code Playgroud) 以下代码片段是获取目录列表的方法的一部分,在每个文件上调用extract方法并将生成的药物对象序列化为xml.
try(Stream<Path> paths = Files.list(infoDir)) {
paths
.parallel()
.map(this::extract)
.forEachOrdered(drug -> {
try {
marshaller.write(drug);
} catch (JAXBException ex) {
ex.printStackTrace();
}
});
}
Run Code Online (Sandbox Code Playgroud)
这是完全相同的完全相同的代码,但使用普通.list()调用来获取目录列表并调用.parallelStream()结果列表.
Arrays.asList(infoDir.toFile().list())
.parallelStream()
.map(f -> infoDir.resolve(f))
.map(this::extract)
.forEachOrdered(drug -> {
try {
marshaller.write(drug);
} catch (JAXBException ex) {
ex.printStackTrace();
}
});
Run Code Online (Sandbox Code Playgroud)
我的机器是四核MacBook Pro,Java v 1.8.0_60(内置1.8.0_60-b27).
我正在处理~7000个文件.平均3次运行:
第一版:有.parallel():20秒.没有.parallel():41秒
第二版:带.parallelStream():12秒.用.stream():41秒.
并行模式下的那8秒似乎是一个巨大的差异,因为extract从流中读取并完成所有繁重工作的方法和write执行最终写入的调用都没有改变.
我已成功使用降雪在具有16个处理器的单个服务器上设置群集.
require(snowfall)
if (sfIsRunning() == TRUE) sfStop()
number.of.cpus <- 15
sfInit(parallel = TRUE, cpus = number.of.cpus)
stopifnot( sfCpus() == number.of.cpus )
stopifnot( sfParallel() == TRUE )
# Print the hostname for each cluster member
sayhello <- function()
{
info <- Sys.info()[c("nodename", "machine")]
paste("Hello from", info[1], "with CPU type", info[2])
}
names <- sfClusterCall(sayhello)
print(unlist(names))
Run Code Online (Sandbox Code Playgroud)
现在,我正在寻找有关如何迁移到分布式模型的完整说明.我有4台不同的Windows机器,总共16个核心,我想用于16节点集群.到目前为止,我了解到我可以手动设置SOCK连接或利用MPI.虽然看起来有可能,但我还没有找到明确和完整的方向.
SOCK路由似乎依赖于snowlib脚本中的代码.我可以使用以下代码从主端生成存根:
winOptions <-
list(host="172.01.01.03",
rscript="C:/Program Files/R/R-2.7.1/bin/Rscript.exe",
snowlib="C:/Rlibs")
cl <- makeCluster(c(rep(list(winOptions), 2)), type = "SOCK", manual = T)
Run Code Online (Sandbox Code Playgroud)
它产生以下结果:
Manually start worker on …Run Code Online (Sandbox Code Playgroud)