1
我正在生成代码,我恰好在将n
单词从一个内存位置复制到另一个不重叠的内存位置。 n
是静态的。有多少单词让memcpy值得呢?
目前,我发出大量的加载指令后跟着大量的存储指令,但我怀疑从某个值n
开始,调用memcpy
会更快。
是否有一个众所周知的指导方针,你需要复制多少字才能使memcpy
值得一个电话?
我正在生成代码,我恰好在将n
单词从一个内存位置复制到另一个不重叠的内存位置。 n
是静态的。有多少单词让memcpy值得呢?
目前,我发出大量的加载指令后跟着大量的存储指令,但我怀疑从某个值n
开始,调用memcpy
会更快。
是否有一个众所周知的指导方针,你需要复制多少字才能使memcpy
值得一个电话?
最优化的代码将取决于处理器的体系结构。数据路径,寄存器大小,可用数据寄存器和缓存的数量是决定最优代码的一些参数。
我不知道你的具体的编译器将如何应对memcpy
功能,但有几点可以帮助你写了一个优化的复制代码:
经常检查生成的汇编代码(如果适用)知道当前的代码是否是最优化的代码。
如果您有n个数据免费注册,那么只加载n值并存储它们以避免需要从堆栈分配内存。处理寄存器比处理其他记忆要快得多。
如果你的处理器有一些寻址模式,在使用它们后自动增加地址,如果这是你想要做的,那么确保生成的程序集正在这样做。
读取连续的值将提高缓存性能,这将为您提供更多优化。
尽你所能,尝试利用加载和存储指令的完整数据路径,并且如果SIMD加载和存储指令可用,请务必使用它们。
通常'memcpy'是一个编译器内在的,这意味着如果你总是使用'memcpy',编译器应该为你做出这个决定。 –
因此,即使是复制单个单词,我也可以合理地使用'memcpy',并且可以不用担心? –
就我所记得的(我必须优化任何C代码已经很长时间了,所以我可能会误解),编译器通常会将(memcpy)替换为(例如)一个单词的等同内联内存移动(或注册副本,甚至在某些情况下甚至没有)。尽管如此,我建议在一个简单的测试用例上检查生成的汇编器。 –