gpt4 book ai didi

c++ - 如何让 Visual C++ 向量化此循环(错误代码 1200)?

转载 作者:太空狗 更新时间:2023-10-29 21:46:02 24 4
gpt4 key购买 nike

我正在尝试让 VC++ 2012 自动矢量化一个看起来有点像这样的循环(实际上正在进行有趣的计算,但为了尽可能地提出问题,它们被省略了) .

parameters:
int period;
unsigned char* out_array;
unsigned char* in_array1;
unsigned char* in_array2;
unsigned char* in_array3;

for (int x = 0; x < width; ++x)
{
int index = period * (x / 2);

out_array[0] = in_array1[x];
out_array[1] = in_array2[index];
out_array[2] = in_array3[index];
out_array += 4;
}

我认为唯一阻碍矢量化的是 out_array += 4,所以我制作了一个内部“展开”循环,希望至少有一个可以矢量化:

for (int x = 0; x < width; ++x)
{
for (int xx = 0; xx < 4; ++xx)
{
int index = period * ((xx + x) / 2);

unsigned char* pout_array = out_array + (4 * xx);
pout_array[0] = in_array1[xx + x];
pout_array[1] = in_array2[index];
pout_array[2] = in_array3[index];
}
out_array += 16;
}

但是当我使用 /Qvect-report:2 运行编译器时,它告诉我由于错误代码 1200,无法对内部循环进行矢量化。错误代码 1200 状态:

Loop contains loop-carried data dependences that prevent vectorization. Different iterations of the loop interfere with each other such that vectorizing the loop would produce wrong answers, and the auto-vectorizer cannot prove to itself that there are no such data dependences.

我不明白这个。显然这个循环的每次迭代都是独立的。我怎样才能让 Visual Studio 对其进行矢量化?

最佳答案

它无法对其进行矢量化的主要原因是,如所写,编译器无法消除 out_array[n] 不是 in_arrayX[m] 的可能性,因此它必须坚持您的顺序。

您可以使用“__restrict”或“restrict”关键字为编译器解决此问题,这是对编译器的 promise ,您只会以确保 out_array 与其他三个指针中的任何一个不同的方式调用它.您可能还想慷慨地使用“const”修饰符来帮助编译器:

void func(const int period,
unsigned char* __restrict out_array,
const unsigned char* in_array1,
const unsigned char* in_array2,
const unsigned char* in_array3)
{
...
//mark 'width' as 'const' if possible:
const int width = ...;
for (int x = 0; x < width; ++x)
{
const int index = period * (x / 2);

out_array[(x* 4) + 0] = in_array1[x];
out_array[(x* 4) + 1] = in_array2[index];
out_array[(x* 4) + 2] = in_array3[index];
}
}

关于c++ - 如何让 Visual C++ 向量化此循环(错误代码 1200)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16092966/

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