Как правильно написать шаблонную функцию для длины вектора с помощью std::experimental::simd?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно написать шаблонную функцию для длины вектора с помощью std::experimental::simd?

Сообщение Anonymous »

Я пытаюсь написать параллельный код, используя экспериментальную поддержку SIMD в C++.
Упрощенный пример:

Код: Выделить всё

#include 
#include 
#include 
#include 

// Funktion zur Berechnung der Länge eines Vectors
template 
constexpr T length(
const std::experimental::simd
v) {
const T length = std::sqrt(std::experimental::reduce(v * v, std::plus{}));
assert(!std::isnan(length));
return length;
}

static_assert(length(
std::experimental::simd<
std::float16_t,
std::experimental::simd_abi::deduce_t>(
static_cast(0))) == 0.f16);

static_assert(length(
std::experimental::simd<
std::float16_t,
std::experimental::simd_abi::deduce_t>(
static_cast(1))) == 2.0f16);
К сожалению, я получаю следующую ошибку от компилятора:

Код: Выделить всё

:16:37: error: no matching function for call to 'length(std::experimental::parallelism_v2::simd)'
16 | static_assert(length(
|               ~~~~~~~~~~~~~~~~~~~~~~^
17 |                   std::experimental::simd<
|                   ~~~~~~~~~~~~~~~~~~~~~~~~
18 |                       std::float16_t,
|                       ~~~~~~~~~~~~~~~
19 |                       std::experimental::simd_abi::deduce_t>(
|                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20 |                       static_cast(0))) == 0.f16);
|                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:16:37: note: there is 1 candidate
:8:13: note: candidate 1: 'template constexpr T length(std::experimental::parallelism_v2::simd)'
8 | constexpr T length(
|             ^~~~~~
:8:13: note: template argument deduction/substitution failed:
:17:38: note:   cannot convert 'std::experimental::parallelism_v2::simd((std::float16_t)0)' (type 'std::experimental::parallelism_v2::simd') to type 'std::experimental::parallelism_v2::simd'
17 |                   std::experimental::simd<
|                                      ^~~~~
18 |                       std::float16_t,
|                       ~~~~~~~~~~~~~~~
19 |                       std::experimental::simd_abi::deduce_t>(
|                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20 |                       static_cast(0))) == 0.f16);
|                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:22:37: error: no matching function for call to 'length(std::experimental::parallelism_v2::simd)'
22 | static_assert(length(
|               ~~~~~~~~~~~~~~~~~~~~~~^
23 |                   std::experimental::simd<
|                   ~~~~~~~~~~~~~~~~~~~~~~~~
24 |                       std::float16_t,
|                       ~~~~~~~~~~~~~~~
25 |                       std::experimental::simd_abi::deduce_t>(
|                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
26 |                       static_cast(1))) == 2.0f16);
|                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:22:37: note: there is 1 candidate
:8:13: note: candidate 1: 'template  constexpr T length(std::experimental::parallelism_v2::simd)'
8 | constexpr T length(
|             ^~~~~~
:8:13: note: template argument deduction/substitution failed:
:23:38: note:   cannot convert 'std::experimental::parallelism_v2::simd((std::float16_t)1)' (type 'std::experimental::parallelism_v2::simd') to type 'std::experimental::parallelism_v2::simd'
23 |                   std::experimental::simd<
|                                      ^~~~~
24 |                       std::float16_t,
|                       ~~~~~~~~~~~~~~~
25 |                       std::experimental::simd_abi::deduce_t>(
|                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
26 |                       static_cast(1))) == 2.0f16);
|                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Пример можно найти здесь: https://godbolt.org/z/ET9fEEWjn
Я уже удалил ссылки, чтобы упростить задачу.
Я предполагаю, что std::experimental::simd_abi::совместимый говорит, что может быть выбран любой ABI, совместимый с T, но он не принимает любой ABI, совместимый с T, но я не уверен.
К сожалению, документация на https://en.cppreference.com/w/cpp/exper ... /simd/simd не так хороша.Раньше я работал с std::valarray, но там я не мог статически ввести количество элементов вектора, поэтому я пытаюсь перейти к std::experimental:::simd.

Подробнее здесь: https://stackoverflow.com/questions/793 ... r-with-std
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»