MATLAB 程式設計入門篇 程式碼與記憶體之最佳化

Slides:



Advertisements
Similar presentations
DOC 推廣活動 月餅星光大道. 中秋  農曆八月十五日,是中國傳統的中秋節。 古人將一年分成春夏秋冬四季,而一季又 分為孟、仲、季三月,八月是仲秋之月, 而十五又是這個月中間的一天,正處在秋 季的正中,所以把八月十五稱為「中秋」 或「仲秋」。  中秋夜,月亮最圓,月色最美,因此人們 把月圓看成是團圓的象徵,同時也稱八月.
Advertisements

中 五 級中 五 級 戰後國共關係 與 中華人民共和國成立 中國歷史科 1 )認識國共政治協商的概況 2 )認識國共內戰的概略經過及結果 3 )中華人民共和國成立.
不吃早餐的影響: 體內的葡萄糖無法 足夠供應給大腦與 肌肉,會感覺疲勞, 注意力無法集中。。 營養的早餐:乳品 + 全榖類食品 + 蛋白質 + 水果 早餐你吃了嗎?
Chapter 13 行銷通路與實體運配.
人文地理專題研究 王志明.
存量房交易纳税评估 系统简介 常州市武进地方税务局 政策法规科 2011 年 7 月.
从永磁体谈起.
2014年爱婴医院复核方案解读 省卫生计生委妇幼处 邱灵.
导言 第四 单元 凡尔赛—华盛顿体系与第二次世界大战
高职人才培养评估核查 与状态数据采集平台建设工作 说 明 广东水利电力职业技术学院 曾志军
社團經費申請 及核銷相關規定 製作:世新大學會計室.
会计实验.
劳动社会保障法学 吴 斌 四川理工学院 法学教授.
“卓越工程师”培养的质量保障体系构建探索
土地出让转让的政策与实务 岳晓武 国土资源部利用司.
电磁铁.
第1章第3节 量化研究与质化研究 案例1:关于中学思想政治教师专业发展现状和需求的调查研究
老師:鍾郁芬 老師 指導 組長:陳欣怡 組員:曾郁雯 倪敏富 王宣化 簡宏倫 黃郁涵
题目回顾 泉水在地下蓄积,一旦有机会,它便骄傲地涌出地面,成为众人瞩目的喷泉,继而汇成溪流,奔向远方。但人们对地下的泉水鲜有关注,其实,正是因为有地下那些默默不语的泉水的不断聚集,才有地上那一股股清泉的不停喷涌。 请根据你对材料的理解和感悟,自选一个角度,写一篇不少于800字的文章,文体自定,标题自拟。要求:立意明确,不要套作,不得抄袭。
广 东 技 术 师 范 学 院 美术学院 装潢专业 2012级(3)班 郑可珊
第十九章 散文 教学要求: 了解散文的含义、分类、特点,学习写作抒情散文。 重点: 散文的特点,散文的写作。 难点: 散文的写作训练。
7--11便利店.
台灣廢物物處理機構 邱騰煥 8 號.
贴近教学 服务师生 方便老师.
农机化项目管理培训会 柳州市农机局 郑崇宁
MATLAB 程式設計入門篇 程式碼與記憶體之最佳化
一二·九运动                                                                    0712班.
中小学教育科研课题的选择 王典伟.
出口农产品风险管理 企业分类及监督管理表格
我的心得報告 經過篩選,挑中我們 十多位學生由學校推薦進入公司,開始他們的學習之旅 學習的過程中有想像不到的意外驚喜
生产企业现代物流解决方案之JIT与TOC
● 四 (2)班 家 长 网络交 流 会 ● 快乐成长 与您 共享 家庭 学校 社会.
学科科研工作与科研 奖励政策解读讲座 朱文斌 博士 教授 2015年9月8日.
空間向量 朱泰吉 蔡宇翔 張力夫 莊孟霏.
第9章 金融监管.
首都师范大学.
Word 2003 學習導引手冊 第一章 WORD 基本操作 作者 丁安強 博碩-Word 2003 學習導引手冊 Ch01.
100學年度土木工程系專題研究成果展 題目: 指導老師:3223 專題學生:2132、2313 前言: 成果: 圖1 圖2 方法與流程:
電腦輔助製圖與實習 (I) 第一章 電腦輔助製圖概況
目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明. 目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明.
認識天球座標系統 數位化教材單元使用說明.
關心今天的老人, 就是關心明天的自己 作者:周儀.
三大思考工具,輕鬆 徹底解決各種問題.
數學與電腦 的初相識 汪群超 個人網址: 變有不可者三,有不可不變者三: 能力未至不可變也、 學識未敷不得變也、 功侯未到不能變也。
第二章 离散傅里叶变换 及其快速算法(8学时 )
目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明. 目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明.
張智星 清大資工系 多媒體檢索實驗室 第九章: 矩陣的處理與運算 張智星 清大資工系 多媒體檢索實驗室.
目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明. 目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明.
目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明. 目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明.
目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明. 目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明.
校 園 雲端輸出管理系統 新印科技股份有限公司 聯絡人:伍宏一 電 話: /
目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明. 目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明.
排列组合 1. 两个基本原理 分类加法计数原理 分步乘法计数原理.
目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明. 目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明.
目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明. 目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明.
目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明. 目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明.
張智星 清大資工系 多媒體檢索實驗室 MATLAB 程式設計進階篇 程式計時 張智星 清大資工系 多媒體檢索實驗室.
《郑伯克段于鄢》 黎兰老师制作.
中華大學 資訊工程學系 報告人:資訊工程學系 許慶賢 系主任.
目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明. 目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明.
第三节 常见天气系统.
MATLAB 程式設計入門篇 初探MATLAB
目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明. 目錄 教學注意事項 教學元件類型 瀏覽課程之基本配備 操作使用說明.
红利、年金、满期金自动转入聚宝盆,收益有保底,升值空间更大
行銷企劃實務 第2章 行銷企劃目標.
仲裁处理细则及常见问题解析.
嘉義縣立溪口國民中學 辦理96年度推動自由軟體學校資訊融入教學
知识点4---向量的线性相关性 1. 线性相关与线性无关 线性相关性的性质 2..
MATLAB 程式設計入門篇 程式碼與記憶體之最佳化
计算机基础与实训教材系列 《中文版Office 2003实用教程》.
Presentation transcript:

MATLAB 程式設計入門篇 程式碼與記憶體之最佳化 張智星 jang@cs.nthu.edu.tw http://www.cs.nthu.edu.tw/~jang 清大資工系 多媒體檢索實驗室

2-1 程式碼的向量化 6.5 版之前,MATLAB 程式環境是一個傳統的解譯器(Interpreter),在執行 MATLAB的程式碼時,會進行下列動作: 逐列對程式碼轉換為 p-code,這是 MATLAB 可以解讀的格式。 對產生的 p-code 進行逐列執行。

2-1 程式碼的向量化 在執行每一列 p-code 時,都還包含一些「經常開銷」(Overhead) 該列執行需要大量運算,經常開銷就會顯得很渺小而不會拖累程式執行速度。 該列只是簡單的運算,那經常開銷的比例就會相對提高 該列是放在迴圈內,那麼程式碼的執行速度就會被這些經常開銷大幅拖慢。

2-1 程式碼的向量化 若要加快執行速度 對向量化運算來進行說明,主要著眼點在於: MATLAB 6.5 版之前,就要盡量不使用迴圈 ,而盡量改用向量化的運算,以降低經常開銷的比例。 MATLAB 6.5 版(含)之後,已經加入了 JIT-Accelerator,有效地降低了經常開銷的比例,同時也使得向量化程式碼的重要性越來越低。 對向量化運算來進行說明,主要著眼點在於: 很多舊的程式碼還是包含向量化的運算。 MATLAB 6.5 之前的版本,向量化的運算還是提高執行效率的主要關鍵。 某些情況下,JIT-Accelerator 的效能無法完全發揮,還是需要配合向量化的運算才可以讓程式碼更有效率。

2-1 程式碼的向量化 計算 n 項調和數列的總和,若使用 for 迴圈,當 n = 100,000 時,可計算其執行時間如下: 範例2-1:hsum01.m tic n = 100000; total = 0; for i = 1:n total = total+1/i; end toc elapsed_time = 2.63000

2-1 程式碼的向量化 由上可知,當 n = 100,000 時,使用 for 迴圈的程式碼約需 2.63 秒才能執行完畢。若改用向量化的運算,可計時如下: 範例2-2:hsum02.m tic n = 100000; sequence = 1:n; total = sum(1./sequence); toc elapsed_time = 0.0600

提示 上述的測試時間是根據Pentium-450, 256 MB RAM在 MATLAB 6.1 所得到的結果。如果你的電腦更快,計算時間的差異性就不會那麼顯著。 在 MATLAB 6.5 版之後,採用了 JIT (Just-In-Time) 的編譯技術,因此「向量化」和「非向量化」的程式執行速度,已經幾乎沒有差異。

2-1 程式碼的向量化 要能夠熟練地運用向量化的運算,有下列三要素: 對矩陣的索引(Indexing)非常熟悉。 對 MATLAB 可用的內建(Built-in)指令非常瞭解。

2-1 程式碼的向量化 一矩陣 x,若要將 a 的每一個元素乘上 x 的每一個直行,我們可使用內建的 diag 指令來達成此功能,例如: 範例2-3: colMultiply01.m x = [1 2 3; 1 1 1]; a = [3 2 1]; y = x*diag(a) y = 3 4 3 3 2 1

2-1 程式碼的向量化 使用 diag 指令,也可以將 a 的每一個元素乘上 x 的每一個橫列,例如: 範例2-4: rowMultiply01.m x = [1 2 3;4 5 6]; a = [3 1]; y = diag(a)*x y = 3 6 9 4 5 6

2-1 程式碼的向量化 將一個行向量拷貝 n 份,可執行如下: 範例2-5:copyCol.m a*ones(1, n) 也可以產生相同的效果。 n = 10; a = [1 3 7]'; rep = a(:, ones(1,n)) rep = 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 7 7 7 7 7 7 7 7 7 7

2-1 程式碼的向量化 將一個列向量拷貝 n 份,可執行如下: 範例2-6:copyRow.m ones(n, 1)*a 也可以產生相同的效果。 n = 5; a = [1 4 8]; rep = a(ones(1,n), :) rep = 1 4 8

2-1 程式碼的向量化 將一個 m×n 矩陣 A 拷貝 M×N 次,並安排成維度大小為(M*m)×(N*n)的大矩陣,可輸入如下: 範例2-7:copyMatrix.m A = [1 2 3; 4 5 6]; m = size(A, 1); n = size(A, 2); M = 3; N = 2; mIndex = (1:m)'*ones(1,M); nIndex = (1:n)'*ones(1,N); B = A(mIndex, nIndex) B = 1 2 3 1 2 3 4 5 6 4 5 6

2-2 JIT加速器 6.5 版後,MATLAB 引進了 JIT (Just-In-Time) 的編譯技術,簡稱 JIT 加速器(JIT-Accelerator) 大幅地降低了迴圈的執行效率。 使得一般程式碼的撰寫,可以使用程式設計師最能代表演算法精神的方式來呈現。 不必為了提高效率、勉強使用向量化運算,造成程式碼維護的困難。

2-2 JIT加速器 向量化運算可以提高執行速度達到 40 倍之多,但是在 JIT 加速器的運作下,向量化運算的光環不在,測試範例如下: 範例2-8:hsum03.m ns = 1000:1000:100000; for i=1:length(ns) n = ns(i); % 第一種方法:for-loop operation tic total = 0; for j = 1:n total = total+sin(1/j); end

2-2 JIT加速器 由此圖可以看出,time1/time2 的值都在 1 左右,甚至常比 1 還低,顯示 JIT 加速器的效能非常優異。 time1 = toc; % 第二種方法:vectorized operation tic total = sum(sin(1./(1:n))); time2 = toc; % 計算倍數 ratio(i)=time1/time2; end plot(ns, ratio, '.-'); grid on xlabel('n'); ylabel('time1/time2'); 由此圖可以看出,time1/time2 的值都在 1 左右,甚至常比 1 還低,顯示 JIT 加速器的效能非常優異。

2-2 JIT加速器 JIT 加速器的主要功能,列出如下: JIT 加速器可以分成兩部分: JIT 加速器可將每一列 MATLAB 程式碼直接轉成「原機指令」,而不再直接使用 p-code,因此省去大部分 p-code 會遇到的經常開銷。 JIT 加速器也會對 Intel X86 為主的 Windows 及 Linux 進行程式碼最佳化。 JIT 加速器可以分成兩部分: Just-In-Time Code Generation:將 p-code 轉成原機指令。 Runtime Type Analysis:對資料型態的分析,以便用於 Just-In-Time Code Generation

2-2 JIT加速器 有了 JIT 加速器,是否還要使用向量化運算呢?基本的判斷原則如下: 所用的向量化運算是根基於「以空間換取時間」,就必須經過測試,才能決定是否值得使用。 所用的向量化運算並非根基於「以空間換取時間」,那還是要盡量使用(尤其是要盡量使用內建指令),因為這種向量化運算不需要額外的空間來暫存資訊,因此效率會比 JIT 加速器更好。 碰到較複雜的資料結構(例如稀疏矩陣及維度超過 3 維的陣列),JIT 加速器並不會轉成原機指令,因此在這種情況下,也要盡量使用向量化運算。

2-2 JIT加速器 使用「不需要額外空間」的向量化運算來提昇效率: 範例2-9: matMultiply01.m ns = 10:50:1200; for j=1:length(ns) n = ns(j); a = rand(n); b = rand(n); % 第一種方法:for-loop operation c = zeros(n); tic for p = 1:n for q = 1:n c(p, q) = a(p, q)*b(p, q); end

2-2 JIT加速器 end time1(j)=toc; % 第二種方法:vectorized operation tic c = a.*b; time2(j)=toc; subplot(2,1,1); plot(ns, time1, 'v-', ns, time2, '^-'); grid on legend('time1 for for-loop code', 'time2 for vectorized code'); xlabel('n'); ylabel('second'); subplot(2,1,2); plot(ns, time1./time2, '.-'); grid on xlabel('n'); ylabel('time1/time2');

2-2 JIT加速器 第一個圖畫出迴圈運算和向量化運算所花的時間。 第二個圖則是時間的比值。 由第二個圖可以看出,加速的倍數大約都在 5 倍以上。

2-2 JIT加速器 為了使 JIT 加速器發揮最大效能,我們的程式碼也要盡量配合,以下是幾點注意事項 迴圈中的索引變數盡量使用純量。 迴圈中的變數盡量是簡單的資料型態,並以不超過二維為主。 迴圈內所呼叫的函式僅限於 MATLAB 內建函式。

2-3 矩陣的預先配置 MATLAB 可隨時改變矩陣的維度,以容納新的資料,但是每一次增大矩陣的容量時: 造成記憶體使用的分散現象,可能導致「實際雖仍有充足的記憶體,但卻未有連續空間以處理較大矩陣」的現象。 基於以上種種原因,若預先知道使用矩陣的維度大小,則最好實施矩陣的預先配置

2-3 矩陣的預先配置 計算矩陣 A 的 n 次方的行列式,其中 n = 1~20000,可輸入如下: 範例2-10: preAllocate01.m A = [1 2; 3 4]; n = 20000; clear detValue; % 清除變數 detValue tic for i = 1:n detValue(i) = det(A^i); end time1=toc; detValue = zeros(1, n); % 預先配置所須矩陣

2-3 矩陣的預先配置 end time2=toc; fprintf('time1 = %g, time2 = %g, time1/time2 = %g\n', time1, time2, time1/time2); time1 = 4.45023, time2 = 0.457984, time1/time2 = 9.71699 上述範例中,使用 detValue = zeros(1, n) 來事先宣告 detValue 所佔用的空間,因此程式碼的執行效率快了將近 10 倍。

2-4 記憶體管理 MATLAB 提供 4 個和記憶體管理直接相關的指令: 指令 說明 clear 從記憶體中清除變數或函數 pack 重新安排記憶體的使用情況,使記憶體分散使用的情況降至最低 doc memory 顯示如何處理「Out of memory」的相關措施 quit 離開 MATLAB,將所有變數佔用的記憶體歸還給作業系統

2-4 記憶體管理 執行 MATLAB 程式碼時,發生「Out of memory」的警告訊息,即表示已無足夠空間可容納新變數,可採取的解決方案為: 隨時使用 clear 指令清除不再須要的變數。 執行 pack 指令,減小記憶體分散使用的現象。 增加虛擬記憶體的大小。 選用適合的資料型態。 如果上述方法仍無法解決,那麼只有減少所用資料量的大小。