Есть ли внутренняя инструкция для результата [i] += A[k] * sin(B[k] * C[i] + D[k])?

У меня есть простая строка кода (64 байта в виде 8 удвоений - точно одна строка кэша i7) в цикле for i который вложен в цикл for k:

 result[i] += A[k] * sin(B[k] * C[i] + D[k])

Я просматриваю руководство по внутренним функциям, но, кажется, потерялся: как запросить такую ​​функцию ?


person DuckQueen    schedule 18.05.2016    source источник
comment
Маловероятно, что для четырехпараметрической операции a * sin(b * c + d) существует встроенная функция. Это не фундаментальная операция, для которой ЦП, скорее всего, будет иметь специальную инструкцию.   -  person Raymond Chen    schedule 18.05.2016


Ответы (1)


Подождите, i или k во внутреннем цикле? Предполагая, что k является константой для всех i, затем транслируем A[k] в целый вектор с _mm256_set1_pd(A[k]) и то же самое для других операндов массива [k].


Как говорит Рэймонд, это слишком сложно для одной инструкции. Даже sin() не реализована аппаратно (кроме скалярной версии x87). Во встроенном руководстве Intel перечислены некоторые функции библиотеки Intel, которые предоставляются только Intel SVML, а не частью gcc / clang <immintrin.h>.


Используйте FMA (_mm256_fmadd_pd) для B[k] * C[i] + D[k] и передайте этот результат в векторизованная функция sin(), если вы можете ее найти.

Подайте этот результат в другой FMA для result[i] += A[k] * ....

Это, конечно, требует двух векторов 32B с AVX.

AVX512 выполняет 64-битные векторы, но пока доступен только в картах ускорителей Xeon Phi.

person Peter Cordes    schedule 18.05.2016
comment
Большое спасибо! Кстати, не могли бы вы связать result[i] += A[k] * ... встроенные функции (по крайней мере, для 32B)? - person DuckQueen; 19.05.2016
comment
@DuckQueen: для упакованного двойного FMA есть только одна встроенная функция, поэтому больше нечего связывать. Компилятор C заботится о выборе между VFMADD132PD/VFMADD231PD. Также есть встроенный fmsub_pd и _mm256_fnmadd_pd для отрицания продукта (например, d - b*c). Поскольку все ваши операции являются сложениями, вам просто нужен один и тот же FMA внутри и снаружи sin(). - person Peter Cordes; 19.05.2016