У меня есть два массива с плавающей запятой, и я хотел бы рассчитать скалярное произведение, используя SSE и AVX, с минимально возможной задержкой. Я знаю, что для поплавков существует 256-битный точечный продукт, но я читал на SO, что это медленнее, чем метод, описанный ниже: (https://stackoverflow.com/a/4121295/997112).
Я сделал большую часть работы, вектор temp_sums
содержит все суммы, мне просто нужно просуммировать все восемь 32-битных сумм, содержащихся в temp_sum
в конце.
#include "xmmintrin.h"
#include "immintrin.h"
int main(){
const int num_elements_in_array = 16;
__declspec(align(32)) float x[num_elements_in_array];
__declspec(align(32)) float y[num_elements_in_array];
x[0] = 2; x[1] = 2; x[2] = 2; x[3] = 2;
x[4] = 2; x[5] = 2; x[6] = 2; x[7] = 2;
x[8] = 2; x[9] = 2; x[10] = 2; x[11] = 2;
x[12] = 2; x[13] = 2; x[14] = 2; x[15] = 2;
y[0] = 3; y[1] = 3; y[2] = 3; y[3] = 3;
y[4] = 3; y[5] = 3; y[6] = 3; y[7] = 3;
y[8] = 3; y[9] = 3; y[10] = 3; y[11] = 3;
y[12] = 3; y[13] = 3; y[14] = 3; y[15] = 3;
__m256 a;
__m256 b;
__m256 temp_products;
__m256 temp_sum = _mm256_setzero_ps();
unsigned short j = 0;
const int sse_data_size = 32;
int num_values_to_process = sse_data_size/sizeof(float);
while(j < num_elements_in_array){
a = _mm256_load_ps(x+j);
b = _mm256_load_ps(y+j);
temp_products = _mm256_mul_ps(b, a);
temp_sum = _mm256_add_ps(temp_sum, temp_products);
j = j + num_values_to_process;
}
//Need to "process" temp_sum as a final value here
}
Я беспокоюсь, что 256-битные встроенные функции, которые мне нужны, недоступны до AVX 1.