我有一个对象列表,每个对象都有一个bool ShouldRun()方法.
我正在迭代对象列表,并检查每个对象上的ShouldRun(),并在第一个上调用Run()返回true
foreach (child in Children)
{
if (child.ShouldRun())
{
child.Run();
break;
}
}
Run Code Online (Sandbox Code Playgroud)
我想并行执行此操作,因为评估shouldRun可能需要相当长的时间,并且让集合中的后续元素尽早开始评估是有利的.
但是,我无法想到一种满足这些条件的方法:
1只运行一个项目
2如果之前的项目为true,或者尚未完成评估,请不要运行以后的项目
3如果所有"早期"项目都返回false,并且中间项目返回true,则不要等待后面的项目完成评估,因为您知道它不能提前覆盖任何内容.
我想做一个并行的"where"linq查询来检索所有的项目,然后运行shouldRun()然后排序,但这会违反条件#3
想法?
背景资料:
该系统用于通用机器人AI系统.
一些较高优先级的任务可以由立即已知的传感器变量触发,例如:我摔倒,修复它!
其他任务可能是计算密集型的(从相机进行图像识别,并接近可见目标)
其他任务可能是数据库或远程驱动(从数据库中查找可能的目标位置列表,然后在那里导航以查看是否可以进入其中一个的可见范围)
一些任务本身具有子任务,这本质上是在一个任务的子集上递归地开始这个过程,并且孙子任务将通过链传递
假设我用以下方式定义所有自然数的序列:
(def naturals (iterate inc 0))
Run Code Online (Sandbox Code Playgroud)
我还定义了一个将自然映射到nil的函数,需要一段时间来计算,如下所示:
(defn hard-comp [_] (Thread/sleep 500))
Run Code Online (Sandbox Code Playgroud)
请注意计算时间以按照度量来评估以下s表达式clojure.core/time.
(dorun (map hard-comp (range 30))) ; 15010.367496毫秒
(dorun (pmap hard-comp (range 30))) ; 537.044554 msecs
(dorun (map hard-comp (doall (take 30 naturals))))) ; 15009.488499 msecs
(dorun (pmap hard-comp (doall (take 30 naturals)))) ; 3004.499013毫秒
(doall (take 30 naturals)) ; 0.385724毫秒
(range 30) ; 0.159374毫秒
pmap 使用显式范围调用时比使用自然部分快6倍.
由于(= (range 30) (take 30 naturals))返回true并且两个对象都是类型clojure.lang.LazySeq,并且clojure在调用函数之前调用函数的所有参数,如何解释上述时序细节?
假设你有一个1000个随机整数的数组,你需要循环它以找到数字68,例如.
在四核CPU上使用新的Parallel.For可以大大提高速度,使每个核心只能工作250个数组项.
问题是:当满足以下条件时,是否可以中断Parallel.For循环?
if (integerArray[i] == 68)
break;
Run Code Online (Sandbox Code Playgroud)
谢谢.
好吧标题不清楚,这就是我的意思.
我正在编程某种游戏(比如生命游戏).例如,有动物(每个动物是一个类的Java实例).
所有这些动物都在地图上,所有这些" 世界 "都演变为每个"转向".
这些动物可以在每个回合动作.例如:狼杀死了一只羊.
但是,我对在状态之间进行这些演变的"方法"有困难,因为结果将取决于我循环通过动物的顺序.
示例:
我怎么解决这个问题 ?
多线程?(但我会有很多动物,比如1000甚至更多......).是否有算法,"方法"来做到这一点?
谢谢
我刚从在线教程和资源中学习OpenMP.我想使用parallel for循环对矩阵(与其自身相乘)进行平方.在IBM编译器文档中,我发现要求"迭代变量必须是signed整数".在GCC实施中也是如此吗?是否在OpenMP标准中指定?如果是这样,这个要求是否有原因?
(这并不重要,因为预期的尺寸远小于INT_MAX,但它确实花了我一些演员阵容.)
使用Python编写科学代码时遇到以下问题:
作为一名工程师,我知道所有关于正确的架构(工作项排队,工作线程或进程,工作结果排队并写入持久存储); 但我不想自己实施.最棘手的问题是由于代码更改或临时系统问题(例如内存不足)而需要重新运行.
我想找到一些框架,我将提供所需的输入(例如,每个运行一行文件)然后我将能够启动一些框架提供的代理的多个实例,它将运行我的代码.如果运行时出现问题(例如临时系统问题或由于bug导致的抛出异常),我将能够删除结果并运行更多代理.如果我占用太多资源,我将能够在不担心数据不一致的情况下杀死一些代理,而其他代理会在找到时间时获取工作项.
现有解决方案吗?有人希望分享他的代码吗?谢谢!
python parallel-processing concurrency scientific-computing multiprocessing
我正在处理大约150万次观测的数据集.我发现在我的数据的一小部分上运行一个回归树(我正在使用包中的mob()*函数party)花费的时间非常长(我不能运行超过50k的一个子集).
我可以想到两个主要问题是减慢计算速度
有没有人对替代树实现提出建议,这些实现对大型数据集更有效,或者我可以改变以使计算更快的事情**?
*我正在使用mob(),因为我想在每个节点的底部进行线性回归,根据它们对治疗变量的响应来分割数据.
**似乎减慢计算量的一件事是我有一个16种类型的因子变量.计算要拆分的变量的哪个子集似乎比其他拆分需要更长的时间(因为有很多不同的方法可以对它们进行分组).这个变量是我们认为重要的变量,因此我不愿完全放弃它.是否有推荐的方法在将类型放入树模型之前将其分组为较少数量的值?
I would like to parallelize a loop like
td <- data.frame(cbind(c(rep(1,4),2,rep(1,5)),rep(1:10,2)))
names(td) <- c("val","id")
res <- rep(NA,NROW(td))
for(i in levels(interaction(td$id))){
res[td$id==i] <- mean(td$val[td$id!=i])
}
Run Code Online (Sandbox Code Playgroud)
with the help of foreach() of the library(doParallel) in order to speed up computations. Unfortunately foreach doesn't seem to support direct assignments, at least
registerDoParallel(4)
res <- rep(NA,NROW(td))
foreach(i=levels(interaction(td$id))) %dopar%{
res[td$id==i] <- mean(td$val[td$id!=i])}
Run Code Online (Sandbox Code Playgroud)
不做我想要的(给出与上面的正常循环相同的结果).任何想法我做错了什么或我怎么能以某种方式"破解" foreach中的.combine选项以便做我想要的?请注意,id变量的顺序在原始数据集中并不总是相同.任何提示都将非常感谢!
你认为这是一个简单的问题,但我找不到解决方案.采取以下循环:
A = zeros(1,10000000);
parfor i = 1:length(A)
A(i) = i;
end
Run Code Online (Sandbox Code Playgroud)
这只能在我的计算机上的一个核心上运行,尽管它很容易并行(或者至少它应该是).我正在使用Matlab 2012b,我已经尝试寻找有关如何创建并行循环但无法找到任何内容的文档(matlab文档只显示如何创建这些循环的示例,而不是如何实际并行运行它们).
我已经尝试查找如何修改并行计算工具箱设置,但它们都不起作用,因为它们全部用于Matlab 2013(我使用的是2012b).如果有人能提供一个实际并行运行的简单,可并行的循环的例子,我将非常感激!
注意:我已经检查并安装了并行计算工具箱,虽然我无法知道它是否已启用,或者如何启用它,因为文档似乎没有为我的版本提供答案(我输入preferences进入命令提示符但没有看到它).
编辑:我通过这样做得到它:
matlabpool('open',4);
A = zeros(1,10000000);
parfor i = 1:length(A)
A(i) = i;
end
matlabpool('close');
Run Code Online (Sandbox Code Playgroud)
...但我真的不知道为什么会这样,我是否每次都关闭游泳池,游泳池实际上是什么(我已经阅读了文档,仍然没有得到它),以及matlabpool与parpool...的区别. .
r ×3
c# ×2
foreach ×2
.net ×1
c ×1
c++ ×1
clojure ×1
concurrency ×1
gpu ×1
java ×1
large-data ×1
linq ×1
map ×1
matlab ×1
openmp ×1
optimization ×1
performance ×1
python ×1
regression ×1
signed ×1