ベクトル化の最適化問題があります。
'red'、'green'、'blue'という名前の3つのフィールドを持つ構造体pDstがあります。
タイプは「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を取得します。
しかし、「フロート」のタイプについては、私はしません。
代わりに、次のメッセージが表示されます。
ループはベクトル化されませんでした:ベクトル化は可能ですが、非効率的なようです。
どうしてそうなるのでしょうか?