带有 return 语句的 Julia @parallel for 循环

2024-04-30

如何在满足条件时立即返回所有工作人员的函数中编写并行 for 循环?

IE。像这样的东西:

function test(n)
  @sync @parallel for i in 1:1000
    {... statement ...}
    if {condition}
      return test(n+1)
    end
  end
end

所有工作人员都停止在 for 循环上工作,只有主进程返回? (其他进程再次开始处理下一个 for 循环?)


这个问题似乎是执行“令人尴尬的并行”搜索任务的基本模式。这@parallel for构造有利于分区工作,但没有break停止的短路逻辑for在单一工艺流程中。

为了演示如何在 Julia 中执行此操作,请考虑一个寻找密码锁与多个轮子的组合的玩具问题。可以通过某种方法检查车轮的每个设置是否正确(采取combodelay时间 - 请参阅下面的代码)。找到正确的轮子编号后,将搜索下一个轮子。高级伪代码就像OP问题中给出的片段。

以下是运行代码(在 0.5 和 0.6 上)来执行此操作。一些注释解释了细节,并且代码以单个块的形式给出,以便于剪切和粘贴。

# combination lock problem parameters
const wheel_max = 1000  # size of wheel
@everywhere const magic_number = [55,10,993]  # secret combination
const wheel_count = length(magic_number)  # number of wheels
const combodelay = 0.01 # delay time to check single combination

# parallel short-circuit parameters
const check_to_work_ratio = 160  # ratio to limit short-circuit overhead

function find_combo(wheel,combo=Int[])
  done = SharedArray{Int}(1)       # shared variable to hold if and what combo
  done[1] = 0                      #  succeded. 0 means not found yet
  # setup counters to limit parallel overhead
  @sync begin
    @everywhere global localdone = false
    @everywhere global checktime = 0.0
    @everywhere global worktime = 0.0
  end
  # do the parallel work
  @sync @parallel for i in 1:wheel_max
    global localdone
    global checktime
    global worktime
    # if not checking too much, look at shared variable
    if !localdone && check_to_work_ratio*checktime < worktime
      tic()
      localdone = done[1]>0
      checktime += toq()
    end
    # if no process found combo, check another combo
    if !localdone
      tic()
      sleep(combodelay) # simulated work delay, {..statement..} from OP
      if i==magic_number[wheel]    # {condition} from OP
        done[1] = i              
        localdone = true
      end
      worktime += toq()
    else
      break
    end
  end
  if done[1]>0 # check if shared variable indicates combo for wheel found
    push!(combo,done[1])
    return wheel<wheel_count ? find_combo(wheel+1,combo) : (combo,true)
  else
    return (combo,false)
  end
end

function find_combo_noparallel(wheel,combo=Int[])
  found = false
  i = 0
  for i in 1:wheel_max
    sleep(combodelay)
    if i==magic_number[wheel]
      found = true
      break
    end
  end
  if found
    push!(combo,i)
    return wheel<wheel_count ? 
      find_combo_noparallel(wheel+1,combo) : (combo,true)
  else
    return (combo,false)
  end
end

function find_combo_nostop(wheel,combo=Int[])
  done = SharedArray{Int}(1)
  done[1] = 0
  @sync @parallel for i in 1:wheel_max
    sleep(combodelay)
    if i==magic_number[wheel]
      done[1] = i
    end
  end
  if done[1]>0
    push!(combo,done[1])
    return wheel<wheel_count ? 
      find_combo_nostop(wheel+1,combo) : (combo,true)
  else
    return (combo,false)
  end
end

result = find_combo(1)
println("parallel with short-circuit stopping:       $result")
@assert result == (magic_number, true)

result = find_combo_noparallel(1)
println("single process with short-circuit stopping: $result")
@assert result == (magic_number, true)

result = find_combo_nostop(1)
println("parallel without short-circuit stopping:    $result")
@assert result == (magic_number, true)

println("\ntimings")

print("parallel with short-circuit stopping        ")
@time find_combo(1);
print("single process with short-circuit stopping  ")
@time find_combo_noparallel(1)
print("parallel without short-circuit stopping     ")
@time find_combo_nostop(1)

nothing

可能会有更好看的实现,并且一些元编程可以隐藏一些短路机制。但这应该是一个好的开始。

结果应大致如下所示:

parallel with short-circuit stopping:       ([55,10,993],true)
single process with short-circuit stopping: ([55,10,993],true)
parallel without short-circuit stopping:    ([55,10,993],true)

timings
parallel with short-circuit stopping          4.473687 seconds
single process with short-circuit stopping   11.963329 seconds
parallel without short-circuit stopping      11.316780 seconds

这是针对 3 个工作进程的演示而计算的。真正的问题应该有更多的进程,每个进程有更多的工作,然后短路的好处就会很明显。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有 return 语句的 Julia @parallel for 循环 的相关文章

  • 如何从 .NET DataGridView 控件单元格值写入文本文件?

    我有以下代码应该循环遍历我的所有行DataGridView 并将其所有单元格值写入文本文件 但是 它输出所有行 但仅输出每行的第一个单元格 而不输出其他三个单元格 string file name C test1 txt var objWr
  • 相当于使用 for-loop 代替 do-while-loop

    我想知道 c 中等效的 for 循环或任何其他循环组合是什么 而不是使用 do while 循环 任何类型的循环都可以通过无限 永远 循环和条件循环的组合来构造break陈述 例如 要转换 do
  • 在 __device/global__ CUDA 内核中动态分配内存

    根据CUDA 编程指南 http developer download nvidia com compute cuda 3 2 prod toolkit docs CUDA C Programming Guide pdf 第 122 页 可
  • 线程与并行处理

    Microsoft NET 4 0 为其框架引入了新的 并行增强功能 我想知道使用标准 System Threading 函数与新的并行增强功能创建应用程序之间有什么区别 并行扩展和常规线程之间最重要的区别可能是控制流 一个线程 使用创建n
  • 如何给DArray的元素设置值?

    我正在探索 Julia 的并行计算并尝试了以下方法 a dzeros 5 a 1 5 但刚刚收到此错误 setindex not defined for DArray Float64 1 Array Float64 1 嗯 我以为手册上说s
  • 使用未解析的运算符 <=

    我正在尝试使用 Swift 3 for 循环 但没有成功 这是我所拥有的 for assumedPayRate Double in 0 25 lt billRate where assumedPayRate 0 25 On the lt 它
  • python 线程是如何工作的?

    我想知道 python 线程是并发运行还是并行运行 例如 如果我有两个任务并在两个线程中运行它们 它们是同时运行还是计划同时运行 我知道GIL并且线程仅使用一个 CPU 核心 这是一个复杂的问题 需要大量解释 我将坚持使用 CPython
  • 如何避免javascript中for循环内的for循环

    我已经编写了一段运行良好的代码 我想要一个新数组 其中包含 myArr 中的元素 按照 orderArr 中指定的顺序 但是 它在另一个 for 循环中使用 for 循环来匹配数组元素 var myArr a b c d e var ord
  • 需要帮助找出为什么 for 循环的计数器变量被循环内的函数更改

    我的循环内的函数以某种方式改变了我正在迭代的值 但我不确定如何改变 如果描述得很糟糕 我很抱歉 在这个 for 循环内 int k for k 0 k lt 512 k Discardheader d doesnt actually do
  • 循环更改多个数据帧

    例如 我有这三个数据集 就我而言 它们更多并且有很多变量 data frame1 lt data frame a c 1 5 3 3 2 b c 3 6 1 5 5 c c 4 4 1 9 2 data frame2 lt data fra
  • 估算缺失数据,同时强制相关系数保持不变

    考虑以下 excel 数据集 m r 2 0 3 3 0 8 4 0 1 3 2 1 5 2 2 3 1 9 2 5 1 2 3 0 2 0 2 6 我的目标是使用以下条件填充缺失值 将上述两列之间的成对相关性表示为 R 大约 0 68 将
  • 在多个 for 循环中使用相同的变量名是不好的做法吗?

    我只是使用 JSHint 来检查一些 JavaScript 代码 在代码中 我有两个 for 循环 它们的用法如下 for var i 0 i lt somevalue i 因此两个 for 循环都使用 var i 进行迭代 现在 JSHi
  • 为什么 Julia 中的“where”语法对换行符敏感?

    在 Stack Overflow 上的另一个问题中 答案包括以下函数 julia gt function nzcols b SubArray T 2 P Tuple UnitRange Int64 UnitRange Int64 where
  • 如何在 Julia 中保存文件

    在某些时候 我认为 Julia v0 7 你可以做 save savepath thingtosave为了使用 Julia 保存文件 我尝试在 v0 7 上运行它 看看是否收到弃用警告 但即使在 0 7 上 它也说 save未定义 如何使用
  • 如何在RcppParallel中调用用户定义的函数?

    受到文章的启发http gallery rcpp org articles parallel distance matrix http gallery rcpp org articles parallel distance matrix 我
  • 为什么 mex 文件中的 OpenMP 仅产生 1 个线程?

    我是 OpenMP 新手 我有以下代码 使用配置了 MSVS2010 的 Matlab mex 可以正常编译 计算机有 8 个可用处理器 我也使用 matlabpool 检查过 include mex h include
  • Bash - 在 perl 正则表达式中使用变量以及匹配组

    这是我在 stackoverflow 上的第一篇文章 如果我错过了一些重要的内容 请原谅我 我目前遇到以下问题 目标是根据我准备的文件列表动态替换端口号find 这些文件中的所有端口均以数字 4 开头 有 5 位数字 现在是棘手的部分 我只
  • C 中“for”循环中的两个变量

    我正在编写一些代码 需要在其中使用两个变量for环形 下面的代码看起来没问题吗 它确实给了我预期的结果 for loop 1 offset loop 2 offset 2 loop 1 gt offset 190 loop 2 lt 190
  • 如何加速 R for 循环?

    我正在为 R 中 GWmodel 包中的 gwr basic 函数运行以下 for 循环 我需要做的是收集任何给定带宽的估计参数的平均值 代码如下 library GWmodel data DubVoter Dub voter LARent
  • 满足条件时终止所有进程

    我正在使用星图来运行测试功能 当进程首次找到排列 5 2 4 3 1 时 终止所有进程的最佳 最安全方法是什么 import multiprocessing as mp import time def testing lts code st

随机推荐

  • 找不到 R.layout.activity_main

    我试图使用一些在线教程来解决多种布局 问题是只要只有一个 XML 文件 我的程序就可以正确构建和编译 当我添加多个 XML 文件时 我收到错误消息 指出该行的 activity main 无法解析或不是字段 setContentView R
  • 无法从 GetProcessId(.. hWnd) (pInvoke) 中提取 processID

    我使用以下方法 DllImport kernel32 dll SetLastError true static extern int GetProcessId IntPtr hWnd 尝试获取正在运行的进程的 processId 我拥有的唯
  • 在应用商店上发布 PWA:google play 和 ios itunes

    有没有办法在应用商店上发布 PWA 来发布应用 谷歌播放和 iOS iTunes 不用用科尔多瓦制造一辆越野车 这会带来大量的维护问题 是的 有办法将您的 PAW 发布到 Android 应用商店 TWAs可信 Web 活动是一种使用基于自
  • MySQL - 选择字符串的前 10 个字节

    各位聪明的男士女士们 大家好 如何选择字符串的前 x 个字节 用例 我正在优化产品描述文本以上传到亚马逊 亚马逊按 utf8 中的字节 不是我之前所说的 latin1 而不是字符来测量字段长度 另一方面 MySQL 似乎是基于字符进行操作的
  • 两个 primefaces 日历组件验证

    我有一个表格JSF 2我使用双字段来指定日期范围 这样做的目的是不让用户选择第二个日期之前的第一个日期 所以我想在发送表单之前执行验证 使用p calendar成分 我所做的是将验证器绑定到第二个日历输入 以便在内部访问第一个组件并比较日期
  • 测试 powermock 模拟客户端调用的 http 服务器超时

    我需要为 connectTimeout 和 SocketTimeout 异常编写测试用例 我使用 powerMock 创建模拟对象 下面是我的代码 但是我的模拟对象出现空指针异常 任何帮助表示赞赏 package com util impo
  • 如何使用 JSON 和 Perl (HTML::Mason) 通过 AJAX 创建动态网页?

    我对处理 Javascript JSON 和 Peel 的方式感到有些困惑 而且大多数示例都是 PHP 语言 这对我没有帮助 我有一个页面 称为 main html 其中包含来自 MySQL 的数据 并且可以选择按 id 删除行 然后我让
  • 如何使用可滑动选项卡实现 PageTransformer

    在我的示例代码中 我在 MainActivity java 中有三个可滑动选项卡 即 Android IOS 和 WINDOWS 我使用滑动在选项卡之间切换 现在 我必须使用可滑动选项卡实现 PageTransformer 所以这里我需要您
  • Yii:如何用另一个模型数据填充选择输入?

    我正在玩一个小应用程序以学习使用 Yii 我创建了一个小型网络应用程序 其中包含 2 个模型 表 项目和任务 一对多关系 在模型类中正确配置 我现在尝试自定义任务 创建视图 用建议可用项目列表的选择框替换文本输入字段 我打开表单视图并尝试了
  • “分支”到底是什么意思?

    长话短说 据我所知 术语 分支 Git 术语 可能指的是相关但不同的事物 指向提交的非符号引用 指针 此类引用的名称 例如 master 存储库提交 DAG 的子图 由此类引用所指向的提交可到达的所有提交组成 然而 我发现这个术语显然指的是
  • 并发 log4j

    我有自己的日志引擎 它将日志写入带有阻塞队列的单独线程上 为了使用 标准软件 我正在考虑切换到 log4j 我不希望我的高并发软件因日志命令而变慢 这些日志命令在调用命令时将所有内容写入磁盘 log4j 可以用作垃圾箱吗 Log4j 是大多
  • python 解码部分 utf-8 字节数组

    我从不了解 UTF 8 规则的通道获取数据 因此 有时当 UTF 8 使用多个字节来编码一个字符并且我尝试将部分接收到的数据转换为文本时 我在转换过程中遇到错误 根据接口的性质 没有任何结束的流 我无法找出数据何时已满 因此我需要处理部分
  • 如何配置 apache 服务器与 HTTPS 后端服务器通信?

    我将 apache 服务器配置为反向代理 如果我将后端服务器指定为 HTTP 则它可以正常工作 那是 我将虚拟主机 443 配置为 ProxyPass primary store http localhost 9763 store Prox
  • Python 单行代码

    我想要用 Python 编写以下代码的单行解决方案 但是如何实现呢 total 0 for ob in self oblist total sum v amount for v in ob anoutherob 它返回总价值 我想要它是单行
  • 如何从复选框数组中保存布尔状态并在使用 SharedPreferences 加载适配器时加载其状态

    我有一个用于列表视图的 CustomAdapter 我需要使用 SharedPreferences 保存布尔数组中的所有复选框状态 我想将技巧的名称 字符串数组 保存为键和每个技巧的状态 我想到的 SharedPreferences 示例
  • Vagrant 同步文件夹权限

    我已经在 Vagrant 中设置了一个从 Windows 主机到来宾的同步文件夹 最初 文件的权限过于开放 因此我添加了以下安装选项 config vm synced folder my folder home vagrant my fol
  • Qt5 CMake 将所有库包含到可执行文件中

    我正在尝试使用 Qt 5 14 构建一个发布模式下的应用程序 并且 Qt Creator 内部一切正常 但是当我尝试单独运行可执行文件时 我收到如下错误 OS Windows 10 Qt 5 14 Cmake 3 5 我尝试过的 设置 CM
  • “未定义变量”通知

    我对 php 很陌生 所以我确信这是一个简单的过程 我收到这个错误 Notice Undefined variable conn in C Dev Webserver Apache2 2 htdocs EclipsePHP thecock
  • Google Checkout 和 Android Market 之间的 API 级别差异是否有记录?

    序言 这个问题已经过时了 不再有 Google Checkout 和 API Android Market 使用 Google Checkout 进行付费应用程序销售 Google Checkout 有相当广泛的 API Android M
  • 带有 return 语句的 Julia @parallel for 循环

    如何在满足条件时立即返回所有工作人员的函数中编写并行 for 循环 IE 像这样的东西 function test n sync parallel for i in 1 1000 statement if condition return