【发布时间】:2012-09-24 07:48:28
【问题描述】:
我有一个矢量化优化问题。
我有一个结构 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。
但是对于“浮动”类型,我没有。
相反,我收到以下消息:
循环未矢量化:可以矢量化但似乎效率低。
怎么可能?
【问题讨论】:
-
在目前的形式下,它不会对你所做的任何事情进行矢量化,因为你在这里进行“收集”操作。
-
这就是我要找的,哪种形式可以实现矢量化?谢谢。
标签: c++ c optimization vectorization icc