C ++ 17 добавляет расширения для параллелизма в стандартную библиотеку (например, std::sort(std::execution::par_unseq, arr, arr + 1000)
, что позволяет выполнять сортировку с использованием нескольких потоков и векторных инструкций).
Я заметил, что в экспериментальной реализации Microsoft упоминается, что компилятор VC ++ не поддерживает векторизацию здесь, что меня удивляет - я думал, что современные компиляторы C ++ могут рассуждать о векторизуемости циклов, но, очевидно, компилятор / оптимизатор VC ++ не может сгенерировать код SIMD, даже если это явно сказано. Кажущееся отсутствие поддержки автоматической векторизации противоречит ответам на этот вопрос 2011 г. на Quora, в котором предполагается, что компиляторы будут выполнять векторизацию там, где это возможно.
Возможно, компиляторы будут векторизовать только очень очевидные случаи, такие как std::array<int, 4>
, и не более того, поэтому явное распараллеливание C ++ 17 будет полезно.
Отсюда мой вопрос: автоматически ли текущие компиляторы векторизуют мой код, если об этом не сказано явно? (Чтобы сделать этот вопрос более конкретным, давайте сузим его до процессоров Intel x86 с поддержкой SIMD и последних версий GCC, Clang, MSVC и ICC.)
В качестве расширения: улучшают ли компиляторы для других языков автоматическую векторизацию (возможно, из-за дизайна языка) (чтобы комитет по стандартам C ++ решил, что это необходимо для явной (в стиле C ++ 17) векторизации)?
std::vec
, что означает, что компилятор (в отличие от библиотеки) не имеет надлежащей поддержки векторизации в целом. Тогда полезность явного распараллеливания C ++ 17 будет связана с тем, что компилятор не может распознать определенные векторизуемые шаблоны, или из-за того, что внешняя информация недоступна для компилятора. - person Bernard   schedule 03.06.2017