我正在寻找一种优雅的方式来实现GNU make中的作业并行化.这是我到目前为止所做的一个例子.以串行方式处理目录dir-1,dir-2和dir-3,这是合乎逻辑的,但不是我的意图:
SUBDIRS=dir-1 dir-2 dir-3
default: all
all:
@for dir in $(SUBDIRS); do (cd $$dir; $(MAKE)); done
.PHONY: clean
clean:
@for dir in $(SUBDIRS); do (cd $$dir; $(MAKE) clean); done
Run Code Online (Sandbox Code Playgroud)
有没有办法支持使用"-j"选项并行处理这些目录而不为每个目录指定特定目标?
什么是广播例程MPI_Bcast的相应MPI接收例程.
也就是说,一个处理器向一个组广播一个消息,比方说全世界,我如何在这些进程中传递消息?
谢谢.
问候
SREC
我已经读过R只使用一个CPU.如何让R使用所有可用的内核来运行统计算法?
我有一个可能的输入值列表
val inputValues = List(1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)
我有一个非常长的计算功能,给我一个结果
def reallyLongFunction( input: Int ) : Option[String] = { ..... }
Run Code Online (Sandbox Code Playgroud)
使用scala并行集合,我可以很容易地做到
inputValues.par.map( reallyLongFunction( _ ) )
Run Code Online (Sandbox Code Playgroud)
为了得到所有结果,并行.问题是,我真的不想要所有的结果,我只想要FIRST的结果.一旦我的一个输入成功,我想要我的输出,并希望继续我的生活.这做了很多额外的工作.
那么我如何才能充分利用这两个世界呢?我想要
编辑 - 我解决它就像一个愚蠢的java程序员一样
@volatile var done = false;
Run Code Online (Sandbox Code Playgroud)
在我的内部设置和检查reallyLongFunction.这有效,但感觉不太scala.想要一个更好的方法来做到这一点....
可能重复:
如何并行化一个简单的python循环?
我是Python的新手(使用Python 3.2),我有一个关于并行化的问题.我有一个for循环,我希望在Python 3.2中使用"多处理"并行执行:
def computation:
global output
for x in range(i,j):
localResult = ... #perform some computation as a function of i and j
output.append(localResult)
Run Code Online (Sandbox Code Playgroud)
总的来说,我想在i = 0到j = 100的范围内执行此计算.因此,我想创建一些进程,每个进程使用总范围的子域调用函数"calculate".有关于如何做到这一点的任何想法?有没有比使用多处理更好的方法?
更具体地说,我想执行域分解,我有以下代码:
from multiprocessing import Pool
class testModule:
def __init__(self):
self
def computation(self, args):
start, end = args
print('start: ', start, ' end: ', end)
testMod = testModule()
length = 100
np=4
p = Pool(processes=np)
p.map(yes tMod.computation, [(length, startPosition, length//np) for startPosition in range(0, length, length//np)])
Run Code Online (Sandbox Code Playgroud)
我收到一条提到PicklingError的错误消息.任何想法可能是这里的问题?
python parallel-processing pickle multiprocessing python-3.x
为了得到myscript.R使用作业调度集群从属节点上运行(即,PBS)
目前,我使用以下命令将R脚本提交给从属节点
qsub -S /bin/bash -p -1 -cwd -pe mpich 1 -j y -o output.log ./myscript.R
Run Code Online (Sandbox Code Playgroud)
R中是否有函数允许我在头节点上运行myscript.R并将各个任务发送到从节点?就像是:
foreach(i=c('file1.csv', 'file2.csv', pbsoptions = list()) %do% read.csv(i)
Run Code Online (Sandbox Code Playgroud)
更新:qsub命令的替代解决方案是#/usr/bin/Rscript从第一行删除myscript.R并直接调用它,如@Josh所指出的
qsub -S /usr/bin/Rscript -p -1 -cwd -pe mpich 1 -j y -o output.log myscript.R
Run Code Online (Sandbox Code Playgroud) 是否有可能,使用Scala的并行集合来并行化并且事先Iterator 没有完全评估它?
这里我谈论的是并行化函数转换Iterator,即map和flatMap.我认为这需要Iterator提前评估一些元素,然后计算更多,一旦消耗了一些元素next.
我所能找到的只需要将迭代器转换为a Iterable或者Stream最多.在Stream当我打电话,然后得到完全评估.par就可以了.
如果没有现成的建议,我也欢迎实施建议.实现应该支持并行map和flatMap.
这基本上是对这个更专业化问题的跟进.在进行并行计算时,有一些关于创建僵尸进程的帖子R:
有几种方法可以进行并行计算,我将重点介绍目前在本地计算机上使用的三种方法.我在带有内核的本地计算机上使用doMC和doParallel使用foreach包4:
(a)注册一个fork集群:
library(doParallel)
cl <- makeForkCluster(4)
# equivalently here: cl <- makeForkCluster(nnodes=getOption("mc.cores", 4L))
registerDoParallel(cl)
out <- foreach(i=1:1000, .combine = "c") %dopar% {
print(i)
}
stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)
(b)注册PSOCK集群:
library(doParallel)
cl <- makePSOCKcluster(4)
registerDoParallel(cl)
out <- foreach(i=1:1000, .combine = "c") %dopar% {
print(i)
}
stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)
(c)使用 doMC
library(doMC)
library(doParallel)
registerDoMC(4)
out <- foreach(i=1:1000, .combine = "c") %dopar% {
print(i)
}
Run Code Online (Sandbox Code Playgroud)
有几个用户观察到在使用该doMC方法时 - 这只是mclapply函数的包装器,所以它不是 …
我试图使用该try()函数来处理我的并行化for循环中发生的错误:
results <- foreach (i = 1:2, .errorhandling = 'remove') %dopar% {
res <- try(myfun(i), TRUE)
}
Run Code Online (Sandbox Code Playgroud)
同
myfun <- function(i){
if (i==1) return(rnorm(1))
else stop('error')
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息
Error in checkForRemoteErrors(val) :
one node produced an error: Error in myfun(i) : error
Run Code Online (Sandbox Code Playgroud)
如何让foreach"循环"忽略错误消息(或者至少更优雅地处理它)?
我已经安装PyCUDA使用pip.我试过两台电脑.
一个全新安装,Python 3.7.1一个安装Python 3.6.5.
使用后一切都失败PuCUDA,没有错误消息.
最小的例子是这样的:
import sys
import pycuda.driver as cuda
import pycuda.autoinit # <-- Comment in order for `print` to work
if __name__ == '__main__':
print('Print works')
sys.stdout.write("Sys print works")
Run Code Online (Sandbox Code Playgroud)
除非我删除,否则不会打印任何内容pycuda.autoinit.
另一个例子是使用
printf:
import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule
if __name__ == '__main__':
mod = SourceModule("""
#include <stdio.h>
__global__ void test() {
printf("I am %d.%d\\n", threadIdx.x, threadIdx.y);
}
""")
func = …Run Code Online (Sandbox Code Playgroud)