我正在编写一个基准程序,比较对齐访问和未对齐访问的性能。
void do_access(int *dest, const int* src, size_t n)
{
while(n--) {
*dest++ = *src++;
}
}
问题在于代码会自动向量化并更改为调用memcpy
,因此我无法比较对齐/未对齐访问的差异。
GCC
有-fno-tree-loop-distribute-patterns
,但我在Visual Studio
中没有看到任何相关选项。
我仍然想要自动矢量化,但不想调用memcpy
。如何阻止MSVC ++这样做?
我想我需要在这里提供一些背景故事。我就像'未对齐访问是UB,因此应该始终避免。',并且有人说'未对齐访问可能比对齐访问更快,尝试编写memcpy并进行比较。'我从未见过任何建议使用未对齐访问性能的文章,因此我决定使用对齐/未对齐访问来编写memcpy并进行比较。
我认为编译器会生成一个需要对齐并且无法运行的指令,而gcc使用-O3就像我预期的那样。它是段错误的。不幸的是,他坚持认为MSVC中的未对齐访问速度更快,但VC将所有内容替换为单个memcpy,因此我无法将性能与VC进行比较。我唯一需要的是禁用用memcpy替换代码。