在 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
的第一个参数应该可行。
我一直在努力并行化一个函数,该函数读取多项式的输入并输出它们的根。多项式采用矩阵形式,列为每个多项式。直接调用它工作得很好,但是一旦我使用 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
的第一个参数应该可行。