例如矩陣乘法
設mc = ma * mb,都是方陣,維數為8。
以c00的計算作為例子,以下這種是最常見的計算順序
c00 = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30
+ a04 * b40 + a05 * b50 + a06 * b60 + a07 * b70
計算順序大致是
tc = 0
tc = tc + a00 * b00
tc = tc + a01 * b10
tc = tc + a02 * b20
tc = tc + a03 * b30
tc = tc + a04 * b40
tc = tc + a05 * b50
tc = tc + a06 * b60
tc = tc + a07 * b70
就是不斷的大魚吃小魚,大魚變得越來越大的過程
但是,這種計算順序耦合性非常高,每一次tc = tc + axx * bxx依賴於上一次的計算結果,我測試過,gcc在o3的情況也並沒智慧型到能優化計算順序。所以,如果我們要優化並行的話,一般需要手動優化成以下的計算順序。
tc =0, tc0 = 1, tc1 = 0, tc2 = 0, tc3 = 0
tc0 = tc0 + a00 * b00
tc0 = tc0 + a01 * b10
tc1 = tc1 + a02 * b20
tc1 = tc1 + a03 * b30
tc2 = tc2 + a04 * b40
tc2 = tc2 + a05 * b50
tc3 = tc3 + a06 * b60
tc3 = tc3 + a07 * b70
tc = tc + tc0
tc = tc + tc1
tc = tc + tc2
tc = tc + tc3
就是有4條大魚分別在吃小魚,最後4條大魚間進行大魚吃小魚
第一種模式,有7次資料依賴,第二種模式,只有5次資料依賴,要知道現在只是8維的情況,維度大的時候,依賴數是大大減少的。
然後呢?問題就出現!由於浮點數的特性,是需要對進過四捨五入的,所以前後兩種計算順序,最終結果是有一點不同的。真的坑的不行,然後還有一種提高優化方法是採用strassen方法,在這種計算方式下,結果差異更恐怖。
正確解決 坑爹的0xc000007b
1 出現0xc000007b 應用程式無法正常啟動 其根本原因是缺乏所需要的dll,提供了錯誤版本的dll相當於沒有dll,提示完全一樣 2 網上有人說缺乏dx執行環境,如果屬實,也是因為缺乏dx相關的dll 所以根本原因,在低一點 3 與程式是32還是64位沒有直接關係,但是與你的程式對應不上的d...
關於坑爹的windows路徑以及 處理相關
在寫指令碼自動處理歸檔windows下本地檔案的時候真的特別頭疼,主要就是windows下檔案命名規則可以中文 夾帶空格以及路徑表示處理起來比較麻煩。表示路徑 不同於linux用 來進行當前目錄跟上一級目錄檔案的路徑分隔,windows使用反斜槓進行分隔表示。但是在python等程式語言中,反斜槓所...
坑爹的JS閉包,怎麼去理解才是正確的
有好些天沒寫文章了,前面一直在搭建自己的部落格後台,由於網域名稱備案一直沒有下來,就只能繼續在這裡寫了。今天寫些什麼了,一般大家比較關心,尤其學js的,就是又愛又恨的乙個概念 閉包。說了這麼多,那麼閉包的定義到底是什麼了。大家一定要注意,不是說能夠訪問到其他作用域的變數就是閉包,這是很籠統的。準確來...