Что такое __m128d? - PullRequest
       83

Что такое __m128d?

0 голосов
/ 13 декабря 2018

Я действительно не могу понять, что такое "ключевое слово", как __m128d в C ++.

Я использую MSVC, а it говорит: The __m128d data type, for use with the Streaming SIMD Extensions 2 instructions intrinsics, is defined in <emmintrin.h>.

Итак, это тип данных?typedef?Если я это сделаю:

#include <emmintrin.h>

int main() {
    __m128d x;
}

Я не вижу определения на <emmintrin.h>.Кажется keyword компилятора?Преобразует ли это ключевое слово что-то вроде «move register xmm0» и т. Д.?Или какая операция делает?

Кажется, что это вообще не тип данных.

Может кто-нибудь мне светит?

1 Ответ

0 голосов
/ 13 декабря 2018

Это typedef?

Да!

__m128d - это тип данных, который, мы надеемся, компилятор сохранит в 128-битном регистре XMM при оптимизации (если не оптимизировать его, как прокомментировал @PeterCordes).По своей сути он не отличается от int или long, которые, как мы надеемся, компилятор будет хранить в целочисленных регистрах при оптимизации.

Фактическое определение зависит от компилятора ;код, который намеревается быть переносимым между MSVC и другими основными компиляторами, которые реализуют встроенные функции Intel, следует избегать в зависимости от деталей определения.

MSVC определяет векторные типы как объединение массивов элементов разных размеров.

В компиляторах, которые реализуют расширения GNU C (gcc и clang), он определяется как 16-байтовый собственный вектор GNU C, равный double s:

// From gcc 7.3's emmintrin.h  (SSE2 extensions).  SSE1 stuff in xmmintrin.h

/* The Intel API is flexible enough that we must allow aliasing with other
   vector types, and their scalar components.  */
typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__));
typedef double __m128d __attribute__ ((__vector_size__ (16), __may_alias__));

в <emmintrin.h>, как прокомментировал @Default.

Атрибут may_alias сообщает компилятору, что __m128d* может использовать псевдонимы других типов так же, как char*, для целей оптимизации на основе C ++правила строгого наложения.


Пример использования: (инициализация переносима между MSVC и другими компиляторами)

__m128d a2 = { -1.388539L, 0.0L };


Для __m128 проверьте Форум Intel и <xmmintrin.h>.

...