インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

SDLT プリミティブ (SDLT_PRIMITIVE)

プリミティブは、SIMD で扱うデータを表します。単なるデータ構造ではなく、C++ オブジェクトとして、データを変更する独自のメソッドを持つことができます。

規則:

現在の制限事項:

これらは、大きな制限のように見えるかもしれませんが、多くの場合、簡単なコード変更でこの要件を満たすことができます。次に例を示します。

class Point3d {
    // メソッド...
protected:
    double v[3];
};

配列の各要素のデータメンバーを public とし、配列 v の代わりに xyz データメンバーを使用するようにメソッドを更新します。

class Point3d {
public:
    // メソッド...
    double x;
    double y;
    double z;
};

より良いコードを生成するため、個別のメンバー代入で明示的にコピー・コンストラクターと代入演算子 (=) を定義します。

SDLT_PRIMITIVE マクロ

上記の条件を満たすオブジェクトは、SDLT のプリミティブ型と見なすことができます。プリミティブをインポート/エクスポートするには、コンテナーがそのデータレイアウトを把握する必要があります。C++11 ではコンパイル時にデータレイアウトが分からないため、ユーザーがデータレイアウトの詳細を SDLT に提供しなければなりません。これは、構造体とそのデータメンバーのカンマ区切りリストを受け付ける SDLT_PRIMITIVE ヘルパーマクロを利用して、簡単に行うことができます。

SDLT_PRIMITIVE(STRUCT_NAME, DATA_MEMBER_1, ...)

使用例

struct UserObject 
{
    float x;
    float y;
    double acceleration;
    int behavior;
};

SDLT_PRIMITIVE(UserObject, x, y, acceleration, behavior)

オブジェクトは、コンテナーで使用する前にプリミティブとして宣言しなければなりません。ただし、float、double、int のようなビルトインの型はその必要がありません。SDLT では、ビルトインの型は自動的にプリミティブと見なされます。

入れ子のプリミティブはサポートされますが、外側のプリミティブの前に内側のプリミティブを宣言する必要があります。次に、最大 2 つの 3D ポイントから成る軸平行バウンディング・ボックスの例を示します。

struct Point3s
{
    float x;
    float y;
    float z;
}; 

struct AABB 
{
    Point3s topLeft;
    Point3s bottomRight;
};

SDLT_PRIMITIVE(Point3s, x, y, z)
SDLT_PRIMITIVE(AABB, topLeft, bottomRight)

struct 定義は、SDLT から派生したものではなく、その命名法も使用していません。そのため、SDLT を使用しないコードでクラスを使用することができます。また、SDLT のコンテナーを使用するコードのみ、プリミティブ宣言にアクセスする必要があります。