Julia:如何让多个工作人员访问模块中的函数?

2024-04-27

我有以下测试模块(MyMod.jl)来在 Julia 中存储一些测试函数。一些核心函数是串行编写的。其他函数并行调用核心函数。

module MyMod

export Dummy,distribute_data,getfrom,recombine_data,regular_test,parallel_test

function Dummy(icol,model,data,A,B) # Generate data from a model
    nz,nx,nh = size(model)  # = size(A) = size(B)
    for ih = 1:nh
        for ix = 1:nx
            for iz = 1:nz
                data[iz,icol] += A[iz,ix,ih]*B[iz,ix,ih]*model[iz,ix,ih]
            end  
        end
    end
end

function distribute_data(X, obj_name_on_worker::Symbol, dim)  # Distributes X over workers
    size_per_worker = floor(Int,size(X,1) / nworkers())
    StartIdx = 1
    EndIdx = size_per_worker
    for (idx, pid) in enumerate(workers())
        if idx == nworkers()
            EndIdx = size(X,1)
        end
        println(StartIdx:EndIdx)
        if dim == 3
            @spawnat(pid, eval(Main, Expr(:(=), obj_name_on_worker, X[StartIdx:EndIdx,:,:])))
        elseif dim == 2
            @spawnat(pid, eval(Main, Expr(:(=), obj_name_on_worker, X[StartIdx:EndIdx,:])))
        end
        StartIdx = EndIdx + 1
        EndIdx = EndIdx + size_per_worker - 1
    end
end

getfrom(p::Int, nm::Symbol; mod=Main) = fetch(@spawnat(p, getfield(mod, nm)))

function recombine_data(Data::Symbol)   # gather data from workers
    Results = cell(nworkers())
    for (idx, pid) in enumerate(workers())
        Results[idx] = getfrom(pid, Data)
    end
    return vcat(Results...)
end

function regular_test(model,data,A,B)
    ncol=size(data,2)
    map((arg)->Dummy(arg,model,data,A,B),[icol for icol = 1:ncol])
end

function parallel_test(model,data,A,B)
    distribute_data(model, :model, 3)
    distribute_data(A, :A, 3)
    distribute_data(B, :B, 3)
    distribute_data(data, :data, 2)
    @everywhere ncol=size(data,2)
    @everywhere begin
        if myid() != 1
            map((arg)->Dummy(arg,model,data,A,B),[icol for icol = 1:ncol])
        end
    end
    P_Data = recombine_data(:data)
    return P_Data
end

end

然后我打开 Julia 会话并运行:

addprocs(3)

using MyMod

nx = 250;
nz = 350;
nh = 150;
ncol = 125;

model = rand(nz,nx,nh);
data = SharedArray(Float64,nz,ncol);
A = rand(nz,nx,nh);
B = rand(nz,nx,nh);

@time P_Data = parallel_test(model,data,A,B);
@time regular_test(model,data,A,B); 

P_Data == data 

The regular_test按预期运行,但是parallel_test产生以下错误:

ERROR: On worker 2:
UndefVarError: Dummy not defined
 in anonymous at /home/username/Desktop/MyMod.jl:58
 in map at ./essentials.jl:153
 in anonymous at /home/username/Desktop/MyMod.jl:58
 in eval at ./sysimg.jl:14
 in anonymous at multi.jl:1378
 in anonymous at multi.jl:907
 in run_work_thunk at multi.jl:645
 [inlined code] from multi.jl:907
 in anonymous at task.jl:63
 in remotecall_fetch at multi.jl:731
 in remotecall_fetch at multi.jl:734
 in anonymous at multi.jl:1380

...and 2 other exceptions.

 in sync_end at ./task.jl:413
 [inlined code] from multi.jl:1389
 in parallel_test at /home/username/Desktop/MyMod.jl:51

我需要做什么调整parallel_test为了防止这个问题?


在这里,您只需要使用:

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

Julia:如何让多个工作人员访问模块中的函数? 的相关文章

  • 具有多个参数和返回值的两个并行函数

    我有两个独立的功能 每一个都需要相当长的时间来执行 def function1 arg do some stuff here return result1 def function2 arg1 arg2 arg3 do some stuff
  • 当父模块中的变量发生更改时,如何访问从另一个模块继承的变量?

    我有一个文件a py avariable None class a def method self global avariable avariable 100 print variable is avariable 和一个文件 b py
  • Haskell 五个独特的 Wordle 单词

    为了好玩 我正在尝试解决 Matt Parker 在他的 Haskell 频道 Standup Maths in Haskell 频道的链接视频中谈到的与 Wordle 相关的问题 基本上 找到 5 个没有任何共同字母的 5 个字母单词 因
  • 将全局标题添加到 Plots.jl 子图

    我想使用 Plots jl 向一组子图添加全局标题 理想情况下 我会做类似的事情 using Plots pyplot plot rand 10 2 plot title Main title title A B layout 2 但是 根
  • C++并行排序

    我需要对存储在结构数组中的数据块进行排序 结构体没有指针 每个块都有其计数器编号以及数组中数据块与结构块相等的位置的坐标 例如 如果我们有一个数据数组 我们可以将其分为 4 个 NxN 块 那么在结构块的索引数组中我们有 4 个结构块 每个
  • 如何并行运行一组函数并等待完成结果?

    我需要同时异步运行一组繁重的函数并将结果填充到列表中 这是伪代码 List
  • parList 和 parBuffer 如何选择?

    我从 haskell 并行开始 我已经成功学习了如何使用一些策略 例如 r0 rseq rdeepseq parList parMap 现在我正在进一步寻求更高的效率 所以这是我的问题 有什么区别parList and parBuffer
  • 如何在 Julia 中使用 set precision?

    我试图增加使用 set precision 函数的代码 但每次我使用示例时 无论多么简单 它总是给出相同的错误 当我做 x big 1 23456789 setprecision x 20 我收到以下错误 ERROR LoadError M
  • AsyncResponse 和 Java 8 并行流问题

    我正在使用 Spring BootJersey rest api POST Path test Produces MediaType APPLICATION JSON Consumes MediaType APPLICATION JSON
  • 如何使用 python 模块的多个 git 分支?

    我想使用 git 来同时处理我正在编写的模块中的多个功能 我目前正在使用 SVN 只有一个工作区 因此我的 PYTHONPATH 上只有该工作区 我意识到这不太理想 所以我想知道是否有人可以建议一种更 正确 的方法来做到这一点 让我用一个假
  • PHP 中的并行处理 - 你是如何做到的?

    我目前正在尝试在 php 中实现一个作业队列 然后 队列将作为批处理作业进行处理 并且应该能够并行处理一些作业 我已经做了一些研究并找到了几种实现它的方法 但我并不太了解它们的优点和缺点 例如 通过多次调用脚本来进行并行处理fsockope
  • 可选参数的 Julia 约定

    假设我有一个函数 例如f x y 但是y参数是可选的 首选设置方式是什么y作为可选参数 对我有用的一种选择 function f x y nothing do stuff if y nothing do stuff else do stuf
  • AsParallel.ForAll 与 Parallel.ForEach

    下面的代码片段有什么区别吗 如果是这样 那又怎样 myList AsParallel ForAll i gt DO SOMETHING and Parallel ForEach mylist i gt DO SOMETHING 主线程会等待
  • 如何使用 Julia 查找矩阵中的连通分量

    假设我有以下矩阵 此处用 Julia 语言定义 mat 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 将一组值为 1 的相邻元素视为一个 分量 如何识别该矩阵有 2 个分量以及每个分量由哪些顶点组成 对于矩
  • 使用 Cuda 并行读取多个文本文件

    我想使用 CUDA 在多个文件中并行搜索给定字符串 我计划使用 pfac 库来搜索给定的字符串 问题是如何并行访问多个文件 示例 我们有一个包含 1000 个文件的文件夹 需要搜索 这里的问题是我应该如何访问给定文件夹中的多个文件 应该动态
  • 有没有对数字(千)进行分组的函数?

    小 模块中是否隐藏着一个函数 它为我执行此操作 my var 23654325432 var reverse var var s d 3 K d g var reverse var I like 数字 格式 http search cpan
  • 从第二个 DF 中查找一个 DF 中属于同等大小的矩形(由两个点给出)的点的快速(矢量化)方法

    我的数据框 A 如下所示 type latw lngs late lngn 0 1000 45 457966 9 174864 45 458030 9 174907 1 1000 45 457966 9 174864 45 458030 9
  • Julia:将 1x1 数组从内积转换为数字

    从内积运算而不是 1x1 数组中获取数字的最佳方法是什么 还有比这更好的方法吗 1 2 3 4 5 6 1 如果可能的话 我不会手动进行内积 我会使用dot i e dot 1 2 3 4 5 6 我注意到你实际上并没有向量 相反你有1x3
  • 在 config/main.php 中找不到 Yii2 模块(不在 /vendor 文件夹下)类

    我在 api 文件夹下创建了一个模块 它本身与 yii2 高级应用程序中的后端和前端处于同一级别 文件夹结构 api 常见的 控制器 楷模 配置 模块 v1 控制器 楷模 运行 测试 网络 在 api config main php 中 r
  • .Net 中可用的并行技术

    我是 Net 平台的新手 我查了一下 发现 Net中有几种做并行计算的方法 任务并行库中的并行任务 即 Net 3 5 PLINQ Net 4 0 异步编程 Net 2 0 异步主要用于执行 I O 繁重的任务 F 有简洁的语法支持这一点

随机推荐