我正在尝试使用Visual C++ 2017自动矢量化器将以下循环矢量化(/ arch:AVX2):
void fun(char* data, char* threshold, char* output, int64_t len)
{
// Assumes output filled with 0
for (int64_t c = 0, mm = len; c < mm; ++c)
{
output[c] = (data[c] < threshold[c])
? (threshold[c] - data[c])
: output[c];
}
}
此代码用于比较2个数组(数据和阈值),如果data 此循环不会自动向量化:好的,我明白了,我需要重写我的循环,以便删除控制流或简化编译器的工作。但是:
码:
for (int64_t c = 0, mm = len; c < mm; ++c)
{
output[c] = (data[c] < threshold[c])
? (char)(threshold[c] - data[c])
: output[c];
}
为什么此(char)强制转换会更改Visual Studio自动矢量化程序的任何内容?这是自动矢量化程序的错误,还是我错过了一些东西? 而且,如果将输出数组的类型从char更改为int,我将无法再使Visual Studio对循环进行矢量化,而GCC可以:
void fun(char* data, char* threshold, int* output, int64_t len)
{
// Assumes output filled with 0
for (int64_t c = 0, mm = len; c < mm; ++c)
{
output[c] = (data[c] < threshold[c])
? (int)(threshold[c] - data[c])
: output[c];
}
}
与GCC相比,缺少Visual Studio 2017自动矢量化程序吗?还是我正在尝试做我不应该做的事情? 最佳答案
这只是错过的优化机会。
自2012年以来,VS矢量化器已取得了很大进步,但与gcc或clang相比仍然相当缺乏。请记住,他们的编译器基于古老的代码库,例如直到最近他们甚至没有SSA表示。
关于c++ - Visual Studio 2017循环自动向量化问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53042924/