【发布时间】:2020-04-29 05:13:09
【问题描述】:
我刚刚被分配重新编写以下 C 函数,以帮助 ARM 编译器生成更高效的汇编代码。有谁知道怎么做?
void some_function(int *data)
{
int i, j;
for (i = 0; i < 64; i++)
{
for (j = 0; j < 64; j++)
data[j + 64*i] = (i + j)/2;
}
}
【问题讨论】:
-
编译器可能已经做得很好了。一种可能性是在循环外部引入
int k = 0;,并在内部循环中使用data[k++] = (i + j) / 2;。 -
我同意 Jonathan 关于信任编译器的观点。我还想提出一个优化建议。尝试摆脱内部循环内的
/2。为此,将循环更改为for (j = 0; j < 64; j+=2)并在其中执行两个(而不是一个)适当的分配。这类似于(但不完全是)循环展开,并避免了潜在的昂贵划分。 -
@Jake'Alquimista'LEE:现在您已经为不需要它的程序添加了另外 16,384 字节的内存和缓存使用,并且对于运行速度可能比
memcpy更快的代码(原样的代码只需要写入内存,其中的少数操作可能与内存并行完成,而memcpy必须同时读取和写入)。 -
@Jake'Alquimista'LEE:如果在多次使用后需要多次重置表,则在程序执行期间执行多次表生成。或者,即使它只需要一次,在运行时初始化它也可能比从磁盘读取它(从程序文件的数据)更快。此外,学生练习不需要在生产代码中有用才能教给学生有用的技能,就像特定的举重动作需要在现实生活中有用才能增强肌肉和改善健康一样。
-
@tum_:我的许多 cmets 的目的不是解决一个特定问题,而是在它在太多学生的头脑中种下、生根、成长之前清除陈腐和错误的“知识” , 并传播。在这种情况下,人们应该采用
memcpy(因为它简单、容易或已经高度优化)而不真正评估它相对于其他解决方案的成本和收益的想法就是这样一种。新手比专家多得多,而 Stack Overflow 是这种杂草的沃土,它们蔓延后更难控制。
标签: c assembly arm micro-optimization