Упрощенный пример:
Код: Выделить всё
#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);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Я уже удалил ссылки, чтобы упростить задачу.
Я предполагаю, что 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