Как использовать std :: эксперимент :: :: simd? - PullRequest
2 голосов
/ 28 октября 2019

Я пытался выполнить пример, приведенный на github std :: simd , но моя векторизованная версия оказалась в 2-3 раза медленнее. Как правильно его использовать?

В документальном фильме отсутствует серьезная документация и дополнительные примеры использования. Конструкторы отсутствуют и т. Д. Я уверен, что я, вероятно, использую его неправильно, но из-за ограниченной документации я не знаю, как поступить.

g ++ -o test test. cpp --std = c ++ 2a -O0

#include <array>
#include <chrono>
#include <cstdlib>
#include <experimental/simd>
#include <iostream>
#include <random>

using std::experimental::native_simd;
using Vec3D_v = std::array<native_simd<float>, 3>;
native_simd<float> scalar_product(const Vec3D_v& a, const Vec3D_v& b) {
  return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
}
using Vec3D = std::array<float, 3>;
float scalar_product(const std::array<float, 3>& a, const std::array<float, 3>& b) {
  return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
}

int main(){
  constexpr std::size_t VECREG_SIZE = native_simd<float>::size();
  std::array<Vec3D, VECREG_SIZE * 1000> arr;
  std::array<Vec3D_v, VECREG_SIZE * 1000> arr_v;
  std::random_device rd;
  std::mt19937 generator(rd());
  std::uniform_real_distribution<float> distribution(0.f, 1.f);
  for( std::size_t i = 0; i < arr.size(); ++i ){
    arr[i] = {distribution(generator), distribution(generator), distribution(generator)};
    arr_v[i] = {distribution(generator), distribution(generator), distribution(generator)};
  }
  float result = 0.f;
  auto start = std::chrono::high_resolution_clock::now();
  for( std::size_t i = 1; i < arr.size(); ++i ){
    result += scalar_product(arr_v[i-1], arr_v[i])[0];
  }
  auto end = std::chrono::high_resolution_clock::now();
  auto elapsed = end - start;
  std::cout << "VC: " << elapsed.count() << '\n' << std::endl;

  result = 0;
  start = std::chrono::high_resolution_clock::now();
  for( std::size_t i = 1; i < arr.size(); ++i ){
    result += scalar_product(arr[i-1], arr[i]);
  }
  end = std::chrono::high_resolution_clock::now();
  elapsed = end - start;
  std::cout << "notVC: " << elapsed.count() << '\n';
  return EXIT_SUCCESS;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...