Ксения (13.12.2019 20:36 - 20:42, просмотров: 1289) ответил Mahagam на а какие конструкции есть в языках, что компиляторы умеют в AVX2?
Эта проблема имеет место еще со времен SSE, когда компиляторы используют для операций только 1-ый элемент вектора. И в этом не сама идея SIMD-инструкций виновата, а то, что в языках программирования не было операций над векторами. А когда программисты их реализовывали по-элементно, обходя в цикле все элементы вектора по очереди, то и компиляторы компилировали то, что написал программист. А следовало бы вспомнить исходный смысл слова "компиляция", который по смыслу близок к подстрочному переводу, нежели подразумевает творческую активность. Т.е. не надо ожидать, что программист напишет алгоритм, а компилятор при компиляции его улучшит, тут надо молиться, чтобы не испортил :).
Тем не менее, эта проблема, на мой взгляд, частично решается за счет введения в языки программирования векторных операций над массивами, которые замечательно компилируются путем обращения к соответствующей библиотечной функции. Т.е. эта проблема находит свое изящное решение не в попытках заставить компилятор мыслить, а на путях создания в языках программирования векторных инструкций, которые уже по своему духу родственны векторным инструкциям CPU и отлично на них ложатся.
Из того, что мне известно, это два языка - Fortran и Python интеллевского разлива. Intel тут, конечно, сильно постарался с эффективной реализацией под свои процессоры, но самое главное все-таки в том, что в обоих этих языках (в современных версиях) векторные операции входят в состав языка. Впрочем, и в языке C не возникло бы с этим проблем, т.к. арифметико-логические операции между парой указателей на массивы в нем отсутствуют. А в языке C++ такие операторы можно доопределить, если создать для числовых векторов специальные классы. В этом случае каждый такой оператор компилируется примитивно - как обращение к соответствующей библиотечной функции.