__m256
読み:アンダースコア-アンダースコア-エムにひゃくごじゅうろく
外語:__m256

 x86プロセッサー用のC/C++で、Intel AVXを扱うための独自のデータ型(変数型)。関連して__m256iと__m256dが存在する。
目次

概要
 Intel AVXで使うYMMレジスターは、256ビット長のSIMD演算装置用レジスターである。これは従来のSSEの128ビット長XMMレジスターの拡張である。
 通常のintやlongなどと性質の異なるものであり、Intel AVXで使われるレジスター幅の変数を定義するため、このような独自の型が用意された。
 またこのデータ型を使用した場合、コンパイラーは自動的にアラインメントを32ビット境界に合わせる。

特徴

定義

Windows
 Microsoft Visual Studio 2010の場合、immintrin.hに、次のように定義がある。
typedef union __declspec(intrin_type) _CRT_ALIGN(32) __m256 {
    float m256_f32[8];
} __m256;
typedef struct __declspec(intrin_type) _CRT_ALIGN(32) {
    double m256d_f64[4];
} __m256d;
typedef union  __declspec(intrin_type) _CRT_ALIGN(32) __m256i {
    __int8              m256i_i8[32];
    __int16             m256i_i16[16];
    __int32             m256i_i32[8];
    __int64             m256i_i64[4];
    unsigned __int8     m256i_u8[32];
    unsigned __int16    m256i_u16[16];
    unsigned __int32    m256i_u32[8];
    unsigned __int64    m256i_u64[4];
} __m256i;
 Cの標準機能のみで定義することができないため、Visual C/C++の独自拡張機能を用いて定義されているが、その実体はどうやらunionのようである。

FreeBSD
 FreeBSD 8.0現在、定義がないため使用できない。

利用方法
 __m256は、関数の戻り値やパラメーターとして利用できるが、他の一般的な算術式と共に使うことはできない。
 処理系の実装に依存するが、この変数型を扱うための関数が用意されており、これを通してIntel AVXを使うことになる。
 結果として、__m256データ型は8つの32ビット浮動小数点数、__m256dデータ型は4つの64ビット浮動小数点数、__m256iデータ型は32個の8ビット整数値、16個の16ビット整数値、8個の32ビット整数値、または4個の64ビット整数値を保持することができる。

再検索