, но он поддерживает другие встроенные функции в моем коде.

тирую следующую простую функцию

void mul(double *a, double *b) {
  for (int i = 0; i<N; i++) a[i] *= b[i];
}

с очень большими массивами, так что это ограничено пропускной способностью памяти. Тестовый код, который я использую ниже. Когда я собираю с-O2 это займет 1,7 секунды. Когда я собираю с-O2 -mavx это займет всего 1,0 секунды. Скалярные операции без кодировки vex выполняются на 70% медленнее!Почему это?

Вот сборка для-O2 а также-O2 -mavx.

https://godbolt.org/g/w4p60f

Система: [email protected] ГГц (Skylake) 32 Гб памяти, Ubuntu 16.10, GCC 6.3

Тестовый код

//gcc -O2 -fopenmp test.c
//or
//gcc -O2 -mavx -fopenmp test.c
#include <string.h>
#include <stdio.h>
#include <x86intrin.h>
#include <omp.h>

#define N 1000000
#define R 1000

void mul(double *a, double *b) {
  for (int i = 0; i<N; i++) a[i] *= b[i];
}

int main() {
  double *a = (double*)_mm_malloc(sizeof *a * N, 32);
  double *b = (double*)_mm_malloc(sizeof *b * N, 32);

  //b must be initialized to get the correct bandwidth!!!
  memset(a, 1, sizeof *a * N);
  memset(b, 1, sizeof *b * N);

  double dtime;
  const double mem = 3*sizeof(double)*N*R/1024/1024/1024;
  const double maxbw = 34.1;
  dtime = -omp_get_wtime();
  for(int i=0; i<R; i++) mul(a,b);
  dtime += omp_get_wtime();
  printf("time %.2f s, %.1f GB/s, efficency %.1f%%\n", dtime, mem/dtime, 100*mem/dtime/maxbw);

  _mm_free(a), _mm_free(b);
}

Ответы на вопрос(1)

Ваш ответ на вопрос