インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
例 2 は、SIMD ループ内で入れ子のプリミティブとアクセサーを使用して、効率的なコードを生成する方法を示します。
#include <stdio.h> #include <sdlt/sdlt.h> #define N 1024 typedef struct XYZs { float x; float y; float z; } XYZTy; SDLT_PRIMITIVE(XYZTy, x, y, z) typedef struct RGBs { float r; float g; float b; XYZTy w; } RGBTy; SDLT_PRIMITIVE(RGBs, r, g, b, w) void main() { sdlt::soa1d_container<RGBTy> aContainer(N); auto a = aContainer.access(); #pragma omp simd for (int k = 0; k<N; k++) { RGBTy c; c.r = k*1.5f; c.g = k*2.5f; c.b = k*3.5f; c.w.x = k*4.5f; c.w.y = k*5.5f; c.w.z = k*6.5f; a[k] = c; } const RGBTy c = a[10]; printf("k = %d, a[k].r = %f, a[k].g = %f, a[k].b = %f \n", 10, c.r, c.g, c.b); printf("k = %d, a[k].w.x = %f, a[k].w.y = %f, a[k].w.z = %f \n", 10, c.w.x, c.w.y, c.w.z);