Как я могу определить, поддерживает ли Clang данную инструкцию SIMD?C++

Программы на C++. Форум разработчиков
Anonymous
Как я могу определить, поддерживает ли Clang данную инструкцию SIMD?

Сообщение Anonymous »

Есть ли способ определить, поддерживает ли текущая версия компилятора Clang данную расширенную инструкцию ЦП?
Как я это знал:

Код: Выделить всё

#if __has_builtin(__builtin_ia32_packssdw256)
[[gnu::target("avx2")]]
__m256i my256_add_epi32(__m256i a, __256i b)
{
return _mm256_add_epi32(a, b, c);
}
#endif
Проблема в том, что __has_builtin(__builtin_ia32_packssdw256) возвращает 1 только в том случае, если вы передаете -mavx2 в командную строку Clang. Однако это плохо: мой код использует [[gnu::target]] специально для того, чтобы избежать необходимости -mavx2, потому что -mavx2 дает компилятору карт-бланш на использование инструкций AVX2 где угодно. Это может привести к сбоям из-за создания экземпляров функции шаблона, которые могут происходить из файла .cpp, скомпилированного с -mavx2, а не из файла .cpp, которого не было.
Проверка версий Clang затруднена, поскольку у него есть два набора номеров версий: LLVM и Apple.
В моем примере с AVX2 это не проблема, поскольку каждая версия компилятора, с которой мы работаем, поддерживает AVX2. Реальный пример, с которым я столкнулся, — это обнаружение внутренней поддержки SHA-512 для ARM64, которая намного новее. Вышеупомянутый AVX2 предназначен для демонстрации проблемы.

Подробнее здесь: https://stackoverflow.com/questions/795 ... nstruction

Вернуться в «C++»