Подождите, 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
a * sin(b * c + d)
существует встроенная функция. Это не фундаментальная операция, для которой ЦП, скорее всего, будет иметь специальную инструкцию. - person Raymond Chen   schedule 18.05.2016