在 Julia 1.6.1 中使用 pmap 时出现类型错误

TypeError using pmap in Julia 1.6.1

我一直在努力并行化一个函数,该函数读取多项式的输入并输出它们的根。多项式采用矩阵形式,列为每个多项式。直接调用它工作得很好,但是一旦我使用 pmap 就会出现奇怪的行为。

using Distributed
@everywhere begin
    using PolynomialRoots
end

addprocs(2)

@everywhere global test = ones(Int64, 10,10)

@everywhere begin
    function polyRootS(n)
        q=test[:,n]
        r = roots(q) # provides poly roots from a vector input
        return r
    end
end

function parPolyRoots()
    pmap(x->polyRootS(x) ? error("failed") : x, 1:10; on_error=identity)
end

for i in 1:10
    r = polyRootS(i)
    println(r)
end 
parPolyRoots()

据我所知,pmap 实际上应该只是在调用 polyRootS 时并行化循环,但我却得到了输出:

ComplexF64[0.30901699437494734 + 0.9510565162951534im, 0.8090169943749473 - 0.587785252292473im, -0.8090169943749473 - 0.587785252292473im, -0.8090169943749475 + 0.587785252292473im, 0.8090169943749475 + 0.5877852522924731im, 0.30901699437494745 - 0.9510565162951535im, -1.0 - 7.671452424696258e-18im, -0.30901699437494734 - 0.9510565162951536im, -0.3090169943749474 + 0.9510565162951536im]

我的测试矩阵和

TypeError(:if, "", Bool, ComplexF64[0.30901699437494734 + 0.9510565162951534im, 0.8090169943749473 - 0.587785252292473im, -0.8090169943749473 - 0.587785252292473im, -0.8090169943749475 + 0.587785252292473im, 0.8090169943749475 + 0.5877852522924731im, 0.30901699437494745 - 0.9510565162951535im, -1.0 - 7.671452424696258e-18im, -0.30901699437494734 - 0.9510565162951536im, -0.3090169943749474 + 0.9510565162951536im])

用于我的 pmap 函数调用。所以我很疑惑。如果有人可以向我指出 pmap 的一些不同文档和/或一些特别有用的示例。

一个不同的问题,我可以开始一个@everything begin end 语句并立即覆盖我定义的函数、数据和包,还是单独隔离它们是最佳做法?

在 VSCode 中使用 Julia 1.6.1 和 Julia 扩展。 运行 使用 Intel i5 的 Win10。

问题与 pmap 无关,这是因为您将匿名函数定义为它的第一个参数: x->polyRootS(x) ? error("failed") : x

如果您查看 TypeError(并参考有关 TypeError 语法的文档),您可以看到它在抱怨它期待 Bool 而不是一个 ComplexF64 数组。三元运算符中 ? 的左侧相当于 if 条件,Julia 期望那里有一个布尔值。相反,对 polyRootS 的调用是 returning 一个 ComplexF64[] 值。

也不清楚您要在那里检查什么。您的 polyRootS 定义没有 return 任何错误指示器 return 值,任何异常都将由 on_error 参数处理。

因此,仅用 polyRootS 替换匿名函数作为 pmap 的第一个参数应该可行。