我正在练习像P3.jl这样的练习。当我运行以下代码时,它没有任何错误,答案是正确的。
N = 10
A = rand(N,N)
SA = convert(SharedArray, A)
T = 100
Jacobi_parallel(SA,N,T)
但是当我使用N = 16386运行时,它有一个错误:
此案例尚不支持
我该如何解决?
谢谢。
答案 0 :(得分:3)
在这部分代码中:
@everywhere function Jacobi_blockwise_parallel_one_time_step(A,x,y,k,threshold)
if k <= threshold
Jacobi_serial_one_block_one_time_step(A,x,y,k)
else
k1 = floor(Int64, k/2)
k2 = k - k1
if (k1 != k2) error("This case is not supported yet") end
lrefs = [@spawn Jacobi_blockwise_parallel_one_time_step(A,x,y,k1,threshold),
@spawn Jacobi_blockwise_parallel_one_time_step(A,x+k1,y,k1,threshold),
@spawn Jacobi_blockwise_parallel_one_time_step(A,x,y+k1,k1,threshold),
@spawn Jacobi_blockwise_parallel_one_time_step(A,x+k1,y+k1,k1,threshold)];
pmap(fetch, lrefs)
end
end
当你第一次用k = N-2调用它时(即N = 2048这会触发我的错误),k = 1023,当你到达'spawn'语句时,在第二次调用' k'变为511,k2变为512,因此触发此错误。
有趣的是,如果在没有首先添加额外的工作进程的情况下运行,则不会出现错误。据推测,@spawn宏在没有定义的工作者时表现不同/意外,我不确定。无论哪种方式,我都不认为lrefs
位正在做作者认为它正在做的事情(也许它是在旧版的朱莉娅中做过的?)