Требования к векторизации C ++ для g cc, clang и msvc - PullRequest
3 голосов
/ 08 января 2020

Верны ли следующие утверждения?

  1. С G CC и clang мой код будет автоматически векторизован, если я скомпилирую с:

    • -O2 -ftree-vectorize -march=XYZ (XYZ - целевой набор команд: нативный, SSE, AVX2 и т. Д. c.)
    • -O3 -march=XYZ
  2. С MSV C, мой код будет автоматически векторизован, если я скомпилирую с:

    • /O2

Это видео кажется, предполагает, что мне не нужно указывать архитектуру с MSV C. Это верно? По умолчанию компилятор будет использовать собственную архитектуру и использовать скалярные операции во время выполнения, если не найдены векторные инструкции.

1 Ответ

1 голос
/ 08 января 2020

Мне не нужно указывать архитектуру с MSV C. Это правильно?

Да, это действительно правильно. С MSV C, по умолчанию, Auto-Vectorizer включен и подбирает соответствующий набор инструктурион для быстрой векторизации. Более того, даже если вы укажете arch, Auto-Vectorizer может генерировать команды, отличные от заданных переключателем /arch, как указано в документации . Например, когда вы компилируете /arch:SSE2, могут выдаваться SSE4.2 инструкции.

С другой стороны, векторизатору VS не хватает некоторых функций по сравнению с g cc или clang.

С G CC и clang мой код будет автоматически векторизован, если я скомпилирую с -O2 -ftree-vectorize -march=XYZ? -O3 -march=XYZ ?

Не обязательно, чтобы включить векторизацию сокращений с плавающей запятой, вам также необходимо использовать -ffast-math или -fassociative-math. Однако, в общем, да, это будет включено. Вы можете найти то же, что написано в документации , Векторизация включена с помощью флага -ftree-vectorize и по умолчанию в -O3

PS: вы можете использовать https://godbolt.org чтобы увидеть все это в действии!

...