gpt4 book ai didi

c++ - Visual Studio 2017 循环自动矢量化问题

转载 作者:行者123 更新时间:2023-11-30 04:55:27 24 4
gpt4 key购买 nike

我正在尝试使用 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 个数组(数据和阈值),如果数据 < 阈值,则将它们的差异存储在输出中,否则为 0。

这个循环不会自动向量化:

info C5002: loop not vectorized due to reason '1100'

Meaning : Loop contains control flow—for example, "if" or "?".

好的,我明白了,我需要重写我的循环,以便删除控制流或为编译器简化它。但是:

  • 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) cast 会改变 Visual Studio auto-vectorizer 的任何内容?这是自动矢量化器的错误还是我遗漏了什么?

此外,如果我将输出数组的类型从 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 是否缺少自动向量化器?还是我正在尝试做一些我不应该做的事情?

最佳答案

这只是错失了优化机会。VS vectorizer 自 2012 年以来有了很大改进,但与 gcc 或 clang 相比仍然很缺乏。请记住,他们的编译器基于古老的代码库,例如他们甚至没有 SSA直到最近才表示。

关于c++ - Visual Studio 2017 循环自动矢量化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53042924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com