インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
例 5 は、2D イメージを RGB 形式から YUV 形式へ変換します。両方のイメージを 2D SoA n_container に格納することで、パフォーマンスが向上できることを示します。
#include <iostream> #include <sdlt/sdlt.h> using namespace sdlt; #define WIDTH 1024 #define HEIGHT 1024 struct RGBs { float r; float g; float b; }; struct YUVs { float y; float u; float v; YUVs(){ }; YUVs& operator=(const RGBs &tmp){ y = 0.229f * tmp.r + 0.587f * tmp.g + 0.114f * tmp.b; u = -0.147f * tmp.r - 0.289f * tmp.g + 0.436f * tmp.b; v = 0.615 * tmp.r - 0.515f * tmp.g - 0.100 * tmp.b; return *this; } YUVs(const RGBs &tmp){ y = 0.229f * tmp.r + 0.587f * tmp.g + 0.114f * tmp.b; u = -0.147f * tmp.r - 0.289f * tmp.g + 0.436f * tmp.b; v = 0.615 * tmp.r - 0.515f * tmp.g - 0.100 * tmp.b; } }; SDLT_PRIMITIVE(RGBs, r, g, b) SDLT_PRIMITIVE(YUVs, y, u, v) int main(){ typedef layout::soa<> LayoutT; n_extent_t<int, int> extents(HEIGHT, WIDTH); /* SoA 形式の N 次元コンテナーの型宣言。 RGBTy と YUVTy はユーザー定義の構造体で、SoA 形式でメモリーに配置する必要がある。 メモリーレイアウトは、layout::soa で指定。 ここでは、2D コンテキストで N 次元の SoA コンテナーを使用。 */ typedef sdlt::n_container< RGBs, LayoutT, decltype(extents) > ContainerRGB; typedef sdlt::n_container< YUVs, LayoutT, decltype(extents) > ContainerYUV; // 入力/出力コンテナーのインスタンス化 ContainerRGB inputRGB(extents); ContainerYUV outputYUV(extents); auto input = inputRGB.const_access(); // inputRGB 用の定数アクセサー・オブジェクトの取得 auto output = outputYUV.access(); // outputYUV 用のアクセサー・オブジェクトの取得 // 各次元の反復範囲を選択 const auto iRGB1 = bounds_d<1>(input); //bound_d<1>(input); const auto iRGB0 = bounds_d<0>(input); //bound_d<0>(input); for(int y = iRGB0.lower(); y < iRGB0.upper(); y++) { #pragma simd for (int x = iRGB1.lower(); x < iRGB1.upper(); x++){ const RGBs temp1 = input[y][x]; YUVs temp2 = temp1; output[y][x] = temp2; } } return 0; }