Ali*_*nia 5 parallel-processing for-loop julia
我已经编写了一个用于求解拉普拉斯方程的串行代码,但是当我尝试在 Julia 中并行编写它时,它比串行代码需要更多的时间和内存。我写了一个简单的例子。我怎样才能并行这段代码?
有一个域t1。
t2将被计算,然后t1 = t2
@everywhere function left!(t1,t2,n,l_type,b_left,dx=1.0,k=50.0)
if l_type==1
for i=1:n
t2[i,1]=(b_left*dx/k)+t1[i,2];
t1[i,1]=t2[i,1];
end
else
for i=1:n
t1[i,1]=b_left;
end
end
return t1 end
# parallel left does not work.
@everywhere function pleft!(t1,t2,n,l_type,b_left,dx=1.0,k=50.0)
if l_type==1
@parallel for i=1:n
t2[i,1]=(b_left*dx/k)+t1[i,2];
t1[i,1]=t2[i,1];
end
else
@parallel for i=1:n
t1[i,1]=b_left;
end
end
return t1
end
n = 10;
t1 = SharedArray(Float64,(n,n));
t2=t1;
typ = 0;
value = 10;
dx = 1;
k=50;
@time t3 = pleft!(t1,t2,n,typ,value,dx,k)
@time t2 = left!(t1,t2,n,typ,value,dx,k)
Run Code Online (Sandbox Code Playgroud)
答案是 :
0.000872 seconds (665 allocations: 21.328 KB) # for parallel one
0.000004 seconds (4 allocations: 160 bytes) #for usual one
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
计算后我应该在 while 循环中计算下面。我需要将下面的代码并行化。
@everywhere function oneStepseri(t1,N)
t2 = t1;
for j = 2:(N-1)
for i = 2:(N-1)
t2[i,j]=0.25*(t1[i-1,j]+t1[i+1,j]+t1[i,j-1]+t1[i,j+1]);
end
end
return t2;
end
Run Code Online (Sandbox Code Playgroud)
谢谢...
我尝试了很多事情。@parallel与SharedArray, Distributed Array, 域划分并使用@spawn. 没有加速。但最近 Julia 添加了“ Threads”,您可以通过JULIA_NUM_THREADS=4
在命令窗口中导出来添加线程。通过使用Threads.@threads您可以并行您的代码。检查这里的线程数Threads.nthreads()
是我的代码,它给了我很好的加速。
#to add threads export JULIA_NUM_THREADS=4
nth = Threads.nthreads(); #print number of threads
println(nth);
a = zeros(10);
Threads.@threads for i = 1:10
a[i] = Threads.threadid()
end
show(a)
b = zeros(100000);
c = zeros(100000);
b[1] = b[end] = 1;
c[1] = c[end] = 1;
function noth(A)
B = A;
for i=2:(length(A)-1)
B[i] = (A[i-1] + A[i+1])*0.5;
end
return B
end
function th(A)
B = A;
Threads.@threads for i=2:(length(A)-1)
B[i] = (A[i-1] + A[i+1])*0.5;
end
return B
end
println("warmup noth , th")
@time bb = noth(b)
@time cc = th(c)
println("end ")
@time bb = noth(b)
@time cc = th(c)
@time bb = noth(b)
@time cc = th(c)
@time bb = noth(b)
@time cc = th(c)
@time bb = noth(b)
@time cc = th(c)
@time bb = noth(b)
@time cc = th(c)
@time bb = noth(b)
@time cc = th(c)
show(bb[10])
println("\nbb ------------------------------------------------------------------------------------------------------------------> cc")
show(cc[10])
Run Code Online (Sandbox Code Playgroud)
答案是这样的
5
[1.0,1.0,2.0,2.0,3.0,3.0,4.0,4.0,5.0,5.0]warmup noth , th
0.008661 seconds (2.53 k allocations: 113.180 KB)
0.020738 seconds (7.94 k allocations: 336.981 KB)
end
0.000446 seconds (4 allocations: 160 bytes)
0.000122 seconds (6 allocations: 224 bytes)
0.000437 seconds (4 allocations: 160 bytes)
0.000135 seconds (6 allocations: 224 bytes)
0.000435 seconds (4 allocations: 160 bytes)
0.000115 seconds (6 allocations: 224 bytes)
0.000447 seconds (4 allocations: 160 bytes)
0.000112 seconds (6 allocations: 224 bytes)
0.000440 seconds (4 allocations: 160 bytes)
0.000109 seconds (6 allocations: 224 bytes)
0.000439 seconds (4 allocations: 160 bytes)
0.000116 seconds (6 allocations: 224 bytes)
0.052478790283203125
bb ------------------------------------------------------------------------------------------------------------------> cc
0.052478790283203125juser@juliabox:~/threads$
Run Code Online (Sandbox Code Playgroud)
5 个线程和 100000 个节点。
请注意,对于热身,没有加速。但之后就会加速。
0.000446 seconds (4 allocations: 160 bytes) # usual code run
0.000122 seconds (6 allocations: 224 bytes) #parallel code run
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2539 次 |
| 最近记录: |