考虑这个用于矢量化的函数:
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等极端情况但如果指针是相同的,就不会有问题,还是我遗漏了什么?
编辑:限制是英特尔C++编译器关键字,MSVC有μ约束。
我对这个问题的看法是,我不认为任何一种矢量化会出错:因为每个dst值都依赖于位于完全不同(没有任何别名)或完全相同地址的单个src值,所以当dst更改时,就不再需要src值了,因为它已经被写入表示输出已计算唯一的情况是编译器将dst本身用作临时缓冲区,我认为这甚至不正确。
最佳答案
在C中,您的代码违反了restrict
定义,从而导致未定义的行为,因为它通过dst
写入一个对象,但通过src
读取同一个对象。
在dst
和src
之间是否存在偏移并不重要,条件是存在一个通过一个指针写入并通过另一个指针读取的float
对象。