2017-06-19 66 views
-1

我與一些運動如P3.jl練習。當我運行下面的代碼時,它沒有任何錯誤,答案是正確的。「朱莉婭 - 郎鹹平:這種情況不支持呢。」

N = 10 
A = rand(N,N) 
SA = convert(SharedArray, A) 
T = 100 
Jacobi_parallel(SA,N,T) 

但是,當我與N = 16386運行,它有一個錯誤:

This case is not supported yet

我該如何解決呢?

謝謝。

+0

這不是茱莉亞的錯誤。 Jacobi_parallel是一個在你鏈接的文件中定義的函數,特定的錯誤在其中被硬編碼。在頁面中搜索短語「這種情況尚不支持」,您會看到它。 (編輯:。不過,HM,誤差就沒有意義了在任何涉及的計算而言或許有意想不到的轉化在somepoint浮動) –

+0

您使用的是什麼版本的朱莉婭?代碼似乎是一個相當老的版本(再加上那裏有一些'怪異的東西',但是,哦,好吧)...雖然修復了一些不兼容的問題,但是腳本在最新的stable版本上運行良好(v0。 5.2)。 (我改變'ifloor(K/2)''到地板(Int64類型,K/2)'和'誤差(''到錯誤(') –

+0

@TasosPapastylianou我使用版本0.5.2太,我施加這些變化,但它有以前的錯誤:這種情況下還不支持 – Armaa

回答

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,和當你到了「重生」的語句,在第二次調用「K」變成511和k2變成512,所以觸發此錯誤。

有趣的是,如果你沒有事先添加額外的工作進程運行錯誤不會出現。據推測,@spawn宏在沒有定義的工作人員時表現不同/出乎意料,我不確定。無論哪種方式,我不認爲lrefs位正在做作者認爲它在做什麼(也許它在舊版本的茱莉亞?)

+0

我不知道它在哪個版本中做過,謝謝。我需要更正這個代碼,你有什麼建議嗎? – Armaa

+1

我可以發現這個錯誤,但是我不能在不知道它應該做什麼功能的情況下「修復它」,而且,我只是發現這個代碼是唯一的「部分解決方案」 [賦值](http://www.csd.uwo.ca/~moreno/cs2101a_moreno/htmls/CS2101-A2.pdf)。(這解釋了錯誤的情況下)。基本上你希望閱讀和理解[此鏈接](http://www.netlib.org/utk/papers/mpi-book/node44.html)並嘗試編寫julia代碼以適當地複製此功能(你可能會也可能不會使用提供的部分代碼)。雖然我不能幫助做作業,對不起。 –

+0

感謝您的解釋。 – Armaa