Я хотел бы знать, предоставляет ли CUDA концепцию, аналогичную std::floating_point, но включающую все типы IEE754, включая, например. __половина. Ниже я привожу пример кода, который проверяет, что функции шаблона __half не компилируются с std::floating_point.
#include <concepts>
#include <iostream>
#include <cuda_fp16.h>
template<std::floating_point T>
__host__ __device__ bool use_floating_point() {
return True;
}
int main() {
std::cout << "Is float a floating-point type?" << use_floating_point<float>() << '\n';
std::cout << "Is __half a floating-point type?" << use_floating_point<__half>() << '\n'; // Compilation error
return 0;
}
@ 463035818_is_not_an_ai Не похоже: godbolt.org/z/bnr6WPM5P (авторам nvidia/стандартной библиотеки придется специализироваться std::numeric_limits<__half>, что, похоже, не так. __half - это тип класса с определенным operator+/etc) действовать как скалярный тип)





Я думаю, что вы ищете std::is_iec559, потому что is_floating_point охватывает только ограниченный набор типов, тогда как is_iec559, насколько я понимаю, должен соответствовать любому типу, реализующему IEE754.
Однако, как отмечает @Artyer в комментарии. std::is_iec559<__half> это false.
Если вам просто нужен std::is_flaoting_point плюс __half, вы можете написать свою собственную концепцию.
template <typename T>
concept floating_or_half = std::floating_point<T> || std::same_as<T,__half>;
template<floating_or_half T>
bool use_floating_point() {
return true;
}
Я действительно не знал о std::is_iec559. std::float16_t находится в std::is_iec559, поэтому я думаю, что это все равно будет работать, если CUDA интегрирует стандарт C++23 в будущем.
std::floating_pointпредназначен только для довольно ограниченного набора типов, вам нужен std::is_iec559, что верно для всех типов с плавающей запятой, которые полностью заполняютсяIEE754. Хотя я не знаю, совпадает ли это на самом деле__half