标签: parallel-processing

同时有效地预测儿童的评估

我有一个对象列表,每个对象都有一个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系统.

一些较高优先级的任务可以由立即已知的传感器变量触发,例如:我摔倒,修复它!

其他任务可能是计算密集型的(从相机进行图像识别,并接近可见目标)

其他任务可能是数据库或远程驱动(从数据库中查找可能的目标位置列表,然后在那里导航以查看是否可以进入其中一个的可见范围)

一些任务本身具有子任务,这本质上是在一个任务的子集上递归地开始这个过程,并且孙子任务将通过链传递

c# linq parallel-processing foreach

7
推荐指数
1
解决办法
794
查看次数

Clojure并行映射和无限序列

假设我用以下方式定义所有自然数的序列:

(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在调用函数之前调用函数的所有参数,如何解释上述时序细节?

parallel-processing optimization performance clojure map

7
推荐指数
1
解决办法
836
查看次数

Parallel.For中断

假设你有一个1000个随机整数的数组,你需要循环它以找到数字68,例如.

在四核CPU上使用新的Parallel.For可以大大提高速度,使每个核心只能工作250个数组项.

问题是:当满足以下条件时,是否可以中断Parallel.For循环?

if (integerArray[i] == 68)

   break;
Run Code Online (Sandbox Code Playgroud)

谢谢.

.net c# parallel-processing parallel-extensions

7
推荐指数
1
解决办法
778
查看次数

生命游戏:如何让"实体"并行发展?

好吧标题不清楚,这就是我的意思.

我正在编程某种游戏(比如生命游戏).例如,有动物(每个动物是一个类的Java实例).

所有这些动物都在地图上,所有这些" 世界 "都演变为每个"转向".

这些动物可以在每个回合动作.例如:狼杀死了一只羊.

但是,我对在状态之间进行这些演变的"方法"有困难,因为结果将取决于我循环通过动物的顺序.

示例:

  • 狼先:狼杀了羊(然后羊死了,所以没动作)
  • 羊首先:羊吃了一些草,然后狼(转过狼)狼杀了羊

我怎么解决这个问题 ?

多线程?(但我会有很多动物,比如1000甚至更多......).是否有算法,"方法"来做到这一点?

谢谢

java parallel-processing cellular-automata

7
推荐指数
2
解决办法
1275
查看次数

为什么循环变量必须并行签名?

我刚从在线教程和资源中学习OpenMP.我想使用parallel for循环对矩阵(与其自身相乘)进行平方.在IBM编译器文档中,我发现要求"迭代变量必须是signed整数".在GCC实施中也是如此吗?是否在OpenMP标准中指定?如果是这样,这个要求是否有原因?

(这并不重要,因为预期的尺寸远小于INT_MAX,但它确实花了我一些演员阵容.)

c c++ parallel-processing signed openmp

7
推荐指数
3
解决办法
2842
查看次数

利用python科学代码收集高度并行计算机的强大功能

使用Python编写科学代码时遇到以下问题:

  • 通常,您会迭代地编写代码,作为执行某些计算的脚本.
  • 最后,它有效; 现在您希望使用多个输入和参数运行它,并发现它需要花费太多时间.
  • 回想一下,你为一个优秀的学术机构工作,可以使用大约100台CPU机器,你很困惑如何获得这种能力.首先准备小shell脚本,使用不同的输入运行原始代码并手动运行它们.

作为一名工程师,我知道所有关于正确的架构(工作项排队,工作线程或进程,工作结果排队并写入持久存储); 但我不想自己实施.最棘手的问题是由于代码更改或临时系统问题(例如内存不足)而需要重新运行.

我想找到一些框架,我将提供所需的输入(例如,每个运行一行文件)然后我将能够启动一些框架提供的代理的多个实例,它将运行我的代码.如果运行时出现问题(例如临时系统问题或由于bug导致的抛出异常),我将能够删除结果并运行更多代理.如果我占用太多资源,我将能够在不担心数据不一致的情况下杀死一些代理,而其他代理会在找到时间时获取工作项.

现有解决方案吗?有人希望分享他的代码吗?谢谢!

python parallel-processing concurrency scientific-computing multiprocessing

7
推荐指数
2
解决办法
684
查看次数

在R中使用GPU进行并行编程

有人可以提供一个使用最新软件包的例子,如何使用R在并行编程中有效地使用GPU 吗?很高兴知道理论上可行的是什么,但谁有一个实际的例子呢?

parallel-processing gpu r

7
推荐指数
1
解决办法
2365
查看次数

在R中的大型数据集上运行回归树

我正在处理大约150万次观测的数据集.我发现在我的数据的一小部分上运行一个回归树(我正在使用包中的mob()*函数party)花费的时间非常长(我不能运行超过50k的一个子集).

我可以想到两个主要问题是减慢计算速度

  1. 使用整个数据集在每个步骤计算拆分.我会对基于数据的随机子集选择变量在每个节点上拆分的结果感到满意,只要它继续补充树中每个子节点处的样本大小即可.
  2. 该操作未并行化.在我看来,只要树首次拆分,它就应该能够使用两个处理器,这样当我的机器中的每个处理器有16个分裂时,它们就会被使用.在实践中,似乎只有一个被使用.

有没有人对替代树实现提出建议,这些实现对大型数据集更有效,或者我可以改变以使计算更快的事情**?

*我正在使用mob(),因为我想在每个节点的底部进行线性回归,根据它们对治疗变量的响应来分割数据.

**似乎减慢计算量的一件事是我有一个16种类型的因子变量.计算要拆分的变量的哪个子集似乎比其他拆分需要更长的时间(因为有很多不同的方法可以对它们进行分组).这个变量是我们认为重要的变量,因此我不愿完全放弃它.是否有推荐的方法在将类型放入树模型之前将其分组为较少数量的值?

parallel-processing regression r large-data cart-analysis

7
推荐指数
1
解决办法
1363
查看次数

Assignment of a value from a foreach loop

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变量的顺序在原始数据集中并不总是相同.任何提示都将非常感谢!

parallel-processing foreach r

7
推荐指数
2
解决办法
2178
查看次数

如何创建并行循环?

你认为这是一个简单的问题,但我找不到解决方案.采取以下循环:

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)

...但我真的不知道为什么会这样,我是否每次都关闭游泳池,游泳池实际上是什么(我已经阅读了文档,仍然没有得到它)​​,以及matlabpoolparpool...的区别. .

parallel-processing matlab

7
推荐指数
1
解决办法
2万
查看次数