考虑这个用于矢量化的函数:
void AddSqr(float* restrict dst, float* restrict src, int cnt)
{
for (int i=0; i<cnt; i++) dst[i] = src[i] * src[i];
};
如果 src & dst 当然没有别名,这将起作用。但是如果 src == dst 呢?像 src == dst+1 这样的极端情况当然是不允许的。但是,如果指针相同,则应该没有问题,还是我遗漏了什么?
编辑:restrict 是 Intel C++ 编译器关键字,MSVC 有 __restrict。
我对这个问题的看法是,我看不出任何一种矢量化如何出错:由于每个 dst 值都依赖于完全不同(没有任何别名)或完全相同地址的单个 src 值,当dst 改变了,src 值就不再需要了,因为它已经被写入意味着输出已经被计算了。唯一的情况是编译器将 dst 本身用作临时缓冲区,我认为这甚至不正确。