В настоящее время я работаю с библиотекой AVX / SSE и хочу сделать процедуру принятия решения во время выполнения для оценки того, какие инструкции доступны для данной архитектуры и ОС, и использовать соответствующую перегруженную функцию. В этой библиотеке уже есть механизм для этого, но он ошибочен.
Я не буду вдаваться в подробности здесь, но упомянутый механизм использует синтаксис __attribute__ (__target __ ()), который позволяет компилировать функцию, которую она помещает раньше, с другими флагами, чем остальная часть программы. Однако попытка выяснить, как правильно использовать это для компиляции функций на основе инструкций SIMD, оказалась довольно сложной, в основном потому, что в официальном руководстве (https://gcc.gnu.org/onlinedocs/gcc/x86-Function-Attributes.html#x86-Function-Attributes) список параметров для __attribute__ (__target __ ()) неполон. По крайней мере, отсутствуют параметры «avx» и «avx2».
Фактически, сравнение содержимого здесь https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc/x86-Function-Attributes.html#x86-Function-Attributes и https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Function-Attributes.html, похоже, не сильно отличается.
Итак, мой вопрос: где я могу найти полный список и другую важную информацию, связанную с параметрами __attribute__ (__target __ ()), доступными в компиляторе gcc-v7.2.0 x86-64?
Также в документации, относящейся к cpuid, gcc.gnu.org/onlinedocs/gcc-8.2.0/gcc/…, функция под названием «__builtin_cpu_support», которая используется целевым преобразователем, также на сайтах avx2, avx512f.
Я прочитал оба, но, хотя они действительно связаны, они не соответствуют друг другу. Cpu_built_in позволяет запрашивать доступность инструкции avx, но не зависит от аргументов для __attribute__ (__target __ ()), просто эти два перекрываются до некоторого уровня в возможностях. А с параметрами компилятора описание атрибута (target ()) говорит, что эти параметры эквивалентны тому или иному флагу. Но не все они доступны в качестве параметров для атрибута (target ()), а те, которые есть, имеют только соответствующее значение, оно недоступно с тем же именем / значением.
По крайней мере, насколько я могу судить ...
Имена, указанные в этой документации по атрибутам функций, совпадают с именами инструкций, которые можно включить в командной строке: gcc.gnu.org/onlinedocs/gcc-8.2.0/gcc/…. Таким образом, есть вероятность, что все эти параметры также являются допустимыми целевыми атрибутами.