2013-02-27 50 views
1

編輯:優化我的Verilog代碼神經網絡中的前饋算法

感謝您的所有建議。我應該更好地把這個問題放在我原來的問題中,對於不清楚這個問題感到抱歉。行prod [0] < = prod [0] + input [0] x weight1 [i];直到產品[25]被執行超過200個時鐘週期。但是,這26次乘法確實同時發生。一次是否太多,或者是否需要在一個時鐘週期內執行1次乘法(32位x 32位),這意味着在200 x 26個時鐘週期內進行所有200 x 26次乘法運算?

另外,我有6個階段到管道整個事情通過:

  1. 26並聯矩陣乘法重複200次(200個時鐘週期)。

  2. 設置一個控制標誌,以便由具有大約200個元素的LUT組成的激活模塊可以完成它的工作併發送結果。每個神經元重複25次(超過25個時鐘週期)。

  3. 重置標誌停止激活功能。重置計數器和一切準備下一部分。

  4. 3個矩陣乘法並行重複25次(25個時鐘週期)。

  5. 再次呼叫激活功能。

  6. 查找從6中獲得的三個值的最大值,以確定輸出應該是什麼(這是一個分類問題)。

以上階段和每個時鐘週期的乘法次數(階段1中的25次和階段2中的3次)是否正常?

或者我應該重做它執行階段2超過200x25時鐘週期和階段4執行超過10x3時鐘週期?

非常感謝所有幫助和建議的傢伙,

費薩爾

ORIGINAL:

我已經編寫,並模擬了人工神經網絡的前饋算法模塊。綜合工具需要很長時間(Synopsys DCS和Xilinx ISE 14.4)......它已經運行了9個多小時,所以我對它的感覺非常糟糕!模擬結果是正確的。

我對NEW設計有一個想法(在消息結尾處),但想由有經驗的人來運行它,看看這是否更有效率,我目前的實施(見下文)或更糟糕,如果更糟,我可以使這麼多算術運算更有效率嗎?

在網絡上的一些背景:

輸入層有200個輸入,

隱層具有25個神經元,

輸出層有3個輸出。

Verilog代碼思路: 我只有一個模塊實現了整個算法。

  1. 第一步是乘以權重(其中200)的輸入端(其中200),用於每個神經元(也有25個神經元) 它計算

prod[0] <= prod[0] + input[0] x weight1[i]; i = 0 to 200-1

.......

prod[25] <= prod[25] + input[25] x weight1[i]; i = 0 to 200-1

和上面重複200個輸入中的每一個都是200次。它同時進行所有25個神經元的計算。

  1. 接下來,對上述結果調用ANN激活函數。這是通過使用具有接近200個元素的LUT(我使用case語句)完成的。爲此,我編寫了另一個activation.v文件,並且必須爲每個神經元實例化25次!

  2. 接着,乘以權重以上的結果的最後3個神經元:

prod_2[0] <= prod_2[0] + prod[0]*weight2[i]; i = 0 to 25-1;

prod_2[1] <= prod_2[1] + prod[0]*weight2[i]; i = 0 to 25-1;

prod_2[2] <= prod_2[2] + prod[0]*weight2[i]; i = 0 to 25-1; ,反覆進行上述25次,每次的25個刺激輸入。它同時對所有3個輸出神經元進行計算。

  1. 最後一步是在prod_2 [0到2]上調用sigmoid。我必須爲此實例化3個更多的激活模塊。

模擬結果很好。但可能非常低效!

所以,我想知道這是否是一個更好的主意?

Top_Module - >神經元 - >乘法和激活

頂部模塊調用的神經元功能(需要實例28元這個!),並把相關的輸入和權重了。神經元函數調用乘法模塊(第一部分需要200個,第二部分需要25個)。神經元函數接下來添加上述200個結果(第2部分中的25個)並調用激活函數。輸出最終返回到Top_Module。

我的問題:

  1. 這是更有效,越早實施這是一個模塊中執行的一切嗎?

  2. 就是實例28層的神經元和神經元的每個實例200個乘法模塊

  3. 任何其他的想法,使我的代碼有效,使Synopsys設計編譯器不需要12小時?

  4. 如果我這樣做,每個神經元有200個輸入和200個權重,這將是它的輸入端口。我不認爲Verilog模塊可以相互傳遞數組。如果沒有,我必須手動寫出所有的400端口而不是傳遞數組嗎?

對不起一個奇怪的問題,但我是新來的整體綜合概念,並想知道這些工具如何去實例化模塊?

謝謝,

費薩爾。

+0

200次乘法運算真的很大。你的設計在每次乘法之間看起來很相似,所以我認爲你可以聲明它是一個模塊並使用generate。可能是這樣更快。 – Khanh 2013-02-27 08:58:37

+0

太好了。非常感謝這個建議......我會盡力而爲,希望它會更有效率。 – 2013-02-27 09:07:40

回答

1

聽起來就像你正試圖做所有這些並行,這意味着很多路由和大量的乘法器。

您可能需要重新工作,以便每次只更新一個輸入*權重,因此您的0..200循環需要200個滴答完成。

+0

那麼,行prod [0] <= prod [0] + input [0] x weight1 [i];直到產品[25]被執行超過200個時鐘週期。對不起,在我的文章中沒有澄清。但是,這26次乘法確實同時發生。一次是否太多,或者是否需要在一個時鐘週期內執行1次乘法(32位x 32位),這意味着在200 x 26個時鐘週期內進行所有200 x 26次乘法運算?這是否更好? – 2013-02-27 21:56:45

1

任何其他的想法,使我的代碼有效,使Synopsys設計編譯器不需要12小時?

先前的建議很好,雖然我看不到所有當前的設計,但確保在模塊之間有足夠的流水線階段。如果您的關鍵路徑對於時間安排來說真的很長,那麼故事梗概會在很長一段時間裏試圖調整您的乘法器以滿足可能不可能的時序約束。

同時減少所需的時鐘頻率可以通過簡化路徑約束來使合成更容易。另外,如果你確實保留了200個乘法器(並不是說你應該這樣做),那麼查看'綜合分區'將會很有用,但是如何做到這一點將取決於你使用的綜合工具。基本上,你合成一個模塊/分區,然後只需複製該分區多次,而不是一次嘗試合成所有模塊。正如你的設計可能試圖獨立優化通過所有200個乘法單元的路徑,實際上你可以爲每個乘法單元使用相同的綜合網表。這裏有一些關於xilinx的信息:http://www.xilinx.com/support/documentation/application_notes/xapp918.pdf