往期技術文章勘誤
最近在整理一個材料,借用了我在往期推送的一些技術文章中的內容。回頭看文章中的細節,發現還是存在一些當時理解不充分,或者是筆誤的地方。由於微信推送出去的文章已經不便於更改(除非重新推送),因此就特起一篇勘誤文章,把目前發現的錯誤訂正下,希望沒有給大家帶來困擾。
《TI C6000優化手冊——讓代碼看起來像釘子》
錯誤位置:描述“restrict”關鍵字的部分。
原文:“restrict”關鍵字也不能隨便亂加,我們需要了解C6000的片上內存組成,只有當兩個指針所指的內存在不同的block裏時,restrict才是合法的。
解析:正如“restrict”的作用所言,用它聲明過的指針變量,能夠保證不會同其它指針變量指向同一個數據體。這與指針指向的數據體是否在同一個block存儲區無關,也不需要考慮具體的片上內存組成形式。比如:
short *restrict a;
short *b;
short x[100];
short y[100];
這裏可以確認程序不會出現a=x;b=x;的情況。而a=x;b=y是合法的,即使數組x和y在同一個block中對齊到了同一個bank。
勘誤:刪除該句。
《現代處理器與代碼性能優化》
錯誤位置:代碼片段3
原文:
void array_sum(short *a, short *sum, length)
{
unsigned int i;
short sum_temp1 = 0;
short sum_temp2 = 0;
for(i=0; i<length-1 ; i+=2)
{
sum_temp1 = sum_temp1 + a[i];
sum_temp2 = sum_temp2 + a[i+1];
}
for(; i<length; i++)
{
sum_temp1 = sum_temp1 + a[i];
}
*sum = sum_temp1 + sum_temp1;
}
解析:最後一條語句中的一個sum_temp1應更改為sum_temp2。
勘誤:
void array_sum(short *a, short *sum, length)
{
unsigned int i;
short sum_temp1 = 0;
short sum_temp2 = 0;
for(i=0; i<length-1 ; i+=2)
{
sum_temp1 = sum_temp1 + a[i];
sum_temp2 = sum_temp2 + a[i+1];
}
for(; i<length; i++)
{
sum_temp1 = sum_temp1 + a[i];
}
*sum = sum_temp1 + sum_temp2;
}
錯誤位置:4.1節 確認性能瓶頸,其中講到Amdahl定律可以用公式表達為: Told/Tnew = 1/[(1-a) + a/b]。
原文:設原程序執行時間為Told,其某部分代碼所需執行時間占該時間的比例為a,而該部分性能提升的比例為b。
解析:最後一小句中b表示為待優化部分代碼性能提升的比例有誤,很容易會發現這裏公式推導不通,b正確的含義是待優化部分代碼性能提升的倍數。
勘誤:設原程序執行時間為Told,其某部分代碼所需執行時間占該時間的比例為a,而該部分性能提升的倍數為b。
·END·
想進一步跟蹤本博客動態,歡迎關註我的個人微信訂閱號:信號君
信號君:尋求簡單之道
技術成長 | 讀書筆記 | 認知升級
掃描二維碼關註信號君
往期技術文章勘誤