私はすでにラプラスの方程式を解くためのシリアルコードを書いていますが、Juliaで並列に書こうとすると、シリアルのものよりも多くの時間とメモリが必要になります。私はそれの簡単な例を書いた。このコードをどのように並列化できますか?julia言語で単純なforループをどのように並列化するのですか?
ドメイン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)
答えは次のとおりです。
0.000872 seconds (665 allocations: 21.328 KB) # for parallel one
0.000004 seconds (4 allocations: 160 bytes) #for usual one
は、どのように私はこの問題を解決することができますか?
私は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
おかげで...
タイミングの前にウォームアップを試みましたか?たとえば '@time rand(1000)'のようなタイミングを取るのではなく、まず 'rand(1000)'を3回または4回実行してJITがそれをコンパイルし、 '@ time'する必要があります。 – RedPointyJackson
はい私はしました。 @timeそのもの。まだ遅すぎる。 –