我正在尝试使用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 此循环不会自动向量化:

好的,我明白了,我需要重写我的循环,以便删除控制流或简化编译器的工作。但是:
  • GCC对其向量化没有问题
  • 如果我以这种方式更改代码,Visual Studio接受对其向量化:

  • 码:
    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/

    10-17 01:31