Re: [討論] 如何不理輸出就繼續執行接下來的程式碼?
首先 我不懂你所謂"不用等待"是什麼意思
因為就算你寫成這樣
b(1) = g(a(1));
for i = 2:n
a(i) = f(a(i-1));
b(i-1) = g(a(i-1));
end
b(n) = g(a(n));
這樣跟你原本的運算時間會差不多
我想你的意思是算a(i)的時候也可以同時算b(i-1);
可是很遺憾這樣的寫法並不行 因為MATLAB會等到這行算完才算下一行
以下幾個建議
因為很明顯b的運算可以改為平行運算所以可以
1)用parfor (但請注意parfor的硬體限制以及overhead的問題), 或是
2)改寫y=g(x)讓g直接處理向量輸入 並輸出向量 (推薦)
至於f因為他仰賴上一個輸入 所以沒辦法平行運算
所以不是這樣
for i = 2:n
a(i) = f(a(i-1));
end
b = G(a);
就是
for i = 2:n
a(i) = f(a(i-1));
end
parfor i=1:n
b(i) = g(a(i));
end
大致這樣
※ 引述《smarter1004 (請拒絕看各新聞台)》之銘言:
: 各位高手大家好
: 我想我還是換個方法問會比較清楚
: 我有兩個函數f及g
: 它們的輸入及輸出皆為1 by 1的double
: n為一個正整數
: 程式碼概略如下:
: a = zeros(1,n);
: b = zeros(1,n);
: a(1) = pi;
: for i = 2:n %迴圈1
: a(i) = f(a(i-1));
: end
: for i = 1:n %迴圈2
: b(i) = g(a(i));
: end
: 可以看到迴圈2中b的計算並不需要全部的a(i)都算出來就能開始算了
: 但如果我把b的計算寫進迴圈1中 那下一個a的計算就要等b算出來才行
: 但f跟g所需的計算時間都相當久
: 而且都不會吃掉cpu全部的核心
: 所以我才在找尋方法讓f跟g可以不用等待
: 用盡cpu所有的力氣去跑
: 謝謝大家幫忙
: ※ 引述《smarter1004 (請拒絕看各新聞台)》之銘言:
: : 各位高手大家好
: : 現在我有兩個函數f及g
: : a(1) = f(a(0)),
: : a(i+1) = f(a(i)),
: : b(i+1) = g(a(i)),
: : 其中i = 1,2,3,...
: : 可以看到f需要的變數只有a(i)
: : 而b(i)只是g輸出的變數沒有被拿來做其它事
: : 我的問題如下
: : g需要a才能算b
: : 但我不知道f什麼時候才會算出a來
: : 如果我在程式碼中寫了算出a(i)後叫g來算b(i+1)
: : 那f就只能等b(i+1)算出來後再算a(i+1)
: : 可是如前所提 f的變數並不需要b
: : 也就是會讓f白等
: : 有什麼辦法讓matlab算出a後讓電腦用其它核心去算b而f的部份繼續呢?
: : 我的matlab沒有平行運算工具箱
: : 謝謝大家幫忙
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 172.250.128.199
※ 編輯: jatj 來自: 172.250.128.199 (10/15 07:07)
※ 編輯: jatj 來自: 172.250.128.199 (10/15 07:09)
討論串 (同標題文章)