2017-04-18 68 views
1

我正在生成代码,我恰好在将n单词从一个内存位置复制到另一个不重叠的内存位置。 n是静态的。有多少单词让memcpy值得呢?

目前,我发出大量的加载指令后跟着大量的存储指令,但我怀疑从某个值n开始,调用memcpy会更快。

是否有一个众所周知的指导方针,你需要复制多少字才能使memcpy值得一个电话?

+2

通常'memcpy'是一个编译器内在的,这意味着如果你总是使用'memcpy',编译器应该为你做出这个决定。 –

+0

因此,即使是复制单个单词,我也可以合理地使用'memcpy',并且可以不用担心? –

+2

就我所记得的(我必须优化任何C代码已经很长时间了,所以我可能会误解),编译器通常会将(memcpy)替换为(例如)一个单词的等同内联内存移动(或注册副本,甚至在某些情况下甚至没有)。尽管如此,我建议在一个简单的测试用例上检查生成的汇编器。 –

回答

1

最优化的代码将取决于处理器的体系结构。数据路径,寄存器大小,可用数据寄存器和缓存的数量是决定最优代码的一些参数。

我不知道你的具体的编译器将如何应对memcpy功能,但有几点可以帮助你写了一个优化的复制代码:

  • 经常检查生成的汇编代码(如果适用)知道当前的代码是否是最优化的代码。

  • 如果您有n个数据免费注册,那么只加载n值并存储它们以避免需要从堆栈分配内存。处理寄存器比处理其他记忆要快得多。

  • 如果你的处理器有一些寻址模式,在使用它们后自动增加地址,如果这是你想要做的,那么确保生成的程序集正在这样做。

  • 读取连续的值将提高缓存性能,这将为您提供更多优化。

  • 尽你所能,尝试利用加载和存储指令的完整数据路径,并且如果SIMD加载和存储指令可用,请务必使用它们。