最近在整理一个材料,借用了我在往期推送的一些技术文章中的内容。回头看文章中的细节,发现还是存在一些当时理解不充分,或者是笔误的地方。由于微信推送出去的文章已经不便于更改(除非重新推送),因此就特起一篇勘误文章,把目前发现的错误订正下,希望没有给大家带来困扰。
错误位置:描述“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·
欢迎来我的微信公众号做客:信号君
专注于信号处理知识、高性能计算、现代处理器&计算机体系
技术成长 | 读书笔记 | 认知升级
幸会~