我有一个矢量化优化问题。
我有一个结构 pDst,它有 3 个字段名为:“红色”、“绿色”和“蓝色”。
类型可能是“Char”、“Short”或“Float”。这是给定的,不能更改。
还有另一个数组 pSrc 表示图像 [RGB] - 即一个由 3 个指针组成的数组,每个指针都指向图像的一层。
每一层都是使用面向 IPP 平面的图像构建的(即,每个平面都是独立形成的 - 'ippiMalloc_32f_C1'):
http ://software.intel.com/sites/products/documentation/hpc/ipp/ippi/ippi_ch3/functn_Malloc.html .
我们希望按照以下代码中的说明复制它:
for(int y = 0; y < imageHeight; ++y)
{
for(int x = 0; x < imageWidth; ++x)
{
pDst[x + y * pDstRowStep].red = pSrc[0][x + y * pSrcRowStep];
pDst[x + y * pDstRowStep].green = pSrc[1][x + y * pSrcRowStep];
pDst[x + y * pDstRowStep].blue = pSrc[2][x + y * pSrcRowStep];
}
}
然而,在这种形式下,编译器不能向量化代码。
起初它说:
“循环未矢量化:存在矢量依赖性。”。
当我使用#pragma ivdep 来帮助编译器时(因为没有依赖关系),我收到以下错误:
“循环未矢量化:取消引用太复杂。”。
任何人都知道如何允许矢量化?
我使用英特尔编译器 13.0。
谢谢。
更新:
如果我编辑代码如下:
Ipp32f *redChannel = pSrc[0];
Ipp32f *greenChannel = pSrc[1];
Ipp32f *blueChannel = pSrc[2];
for(int y = 0; y < imageHeight; ++y)
{
#pragma ivdep
for(int x = 0; x < imageWidth; ++x)
{
pDst[x + y * pDstRowStep].red = redChannel[x + y * pSrcRowStep];
pDst[x + y * pDstRowStep].green = greenChannel[x + y * pSrcRowStep];
pDst[x + y * pDstRowStep].blue = blueChannel[x + y * pSrcRowStep];
}
}
对于'char'和'short'的输出类型,我得到了vecotization。
然而,对于“浮动”类型,我没有。
相反,我收到以下消息:
循环未矢量化:矢量化可能但似乎效率低下。
怎么可能?