Tested Standard C++ APIs
The basic functionality for several C++ standard APIs has been tested for use in SYCL* kernels. These APIs can be employed in device kernels similarly to how they are employed in code for a typical CPU-based platform. The Tested Standard C++ APIs are added to the namespace oneapi::dpl. The corresponding headers have been added in the Intel® oneAPI DPC++ Library (oneDPL) package. In order to use these APIs via the namespace oneapi::dpl, the headers in <oneapi/dpl/...> must be included. Currently, Tested Standard C++ APIs can be used in two ways:
Via the namespace std:: and standard headers (for example: <utility>...)
Via the namespace oneapi::dpl and oneDPL headers (for example: <oneapi/dpl/utility>...)
Below is an example code that shows how to use oneapi::dpl::swap in SYCL device code:
#include <oneapi/dpl/utility>
#include <sycl/sycl.hpp>
#include <iostream>
#include <cstdint>
int main()
{
sycl::queue queue;
constexpr std::uint32_t size = 2;
std::uint32_t data[size] = {4, 5};
std::cout << "Initial data: " << data[0] << ", " << data[1] << std::endl;
sycl::buffer<std::uint32_t> buffer(data, size);
queue.submit([&](sycl::handler& cgh) {
auto access = buffer.get_access(cgh, sycl::read_write);
cgh.single_task<class KernelSwap>([=]() {
oneapi::dpl::swap(access[0], access[1]);
});
}).wait();
auto host_access = buffer.get_host_access(sycl::read_only);
std::cout << "After swap: " << host_access[0] << ", " << host_access[1] << std::endl;
return 0;
}
Use the following command to build and run the program (assuming it resides in the kernel_swap.cpp file):
icpx -fsycl kernel_swap.cpp -o kernel_swap && ./kernel_swap
The printed result is:
Initial data: 4, 5
After swap: 5, 4
Tested Standard C++ API Reference
C++ Standard API |
libstdc++ |
libc++ |
MSVC |
---|---|---|---|
std::swap |
Tested |
Tested |
Tested |
std::lower_bound |
Tested |
Tested |
Tested |
std::upper_bound |
Tested |
Tested |
Tested |
std::binary_search |
Tested |
Tested |
Tested |
std::equal_range |
Tested |
Tested |
Tested |
std::tuple |
Tested |
Tested |
Tested |
std::pair |
Tested |
Tested |
Tested |
std::reference_wrapper |
Tested |
Tested |
Tested |
std::ref/cref |
Tested |
Tested |
Tested |
std::divides |
Tested |
Tested |
Tested |
std::minus |
Tested |
Tested |
Tested |
std::plus |
Tested |
Tested |
Tested |
std::negate |
Tested |
Tested |
Tested |
std::modulus |
Tested |
Tested |
Tested |
std::multiplies |
Tested |
Tested |
Tested |
std::equal_to |
Tested |
Tested |
Tested |
std::greater |
Tested |
Tested |
Tested |
std::greater_equal |
Tested |
Tested |
Tested |
std::less |
Tested |
Tested |
Tested |
std::less_equal |
Tested |
Tested |
Tested |
std::not_equal_to |
Tested |
Tested |
Tested |
std::bit_and |
Tested |
Tested |
Tested |
std::bit_not |
Tested |
Tested |
Tested |
std::bit_xor |
Tested |
Tested |
Tested |
std::bit_or |
Tested |
Tested |
Tested |
std::logical_and |
Tested |
Tested |
Tested |
std::logical_or |
Tested |
Tested |
Tested |
std::logical_not |
Tested |
Tested |
Tested |
std::binary_negate |
Tested |
Tested |
Tested |
std::unary_negate |
Tested |
Tested |
Tested |
std::not1/2 |
Tested |
Tested |
Tested |
std::initializer_list |
Tested |
Tested |
Tested |
std::forward |
Tested |
Tested |
Tested |
std::move |
Tested |
Tested |
Tested |
std::move_if_noexcept |
Tested |
Tested |
Tested |
std::integral_constant |
Tested |
Tested |
Tested |
std::is_same |
Tested |
Tested |
Tested |
std::is_base_of |
Tested |
Tested |
Tested |
std::is_base_of_union |
Tested |
Tested |
Tested |
std::is_convertible |
Tested |
Tested |
Tested |
std::extent |
Tested |
Tested |
Tested |
std::rank |
Tested |
Tested |
Tested |
std::remove_all_extents |
Tested |
Tested |
Tested |
std::remove_extent |
Tested |
Tested |
Tested |
std::add_const |
Tested |
Tested |
Tested |
std::add_cv |
Tested |
Tested |
Tested |
std::add_volatile |
Tested |
Tested |
Tested |
std::remove_const |
Tested |
Tested |
Tested |
std::remove_cv |
Tested |
Tested |
Tested |
std::remove_volatile |
Tested |
Tested |
Tested |
std::decay |
Tested |
Tested |
Tested |
std::conditional |
Tested |
Tested |
Tested |
std::enable_if |
Tested |
Tested |
Tested |
std::common_type |
Tested |
Tested |
Tested |
std::declval |
Tested |
Tested |
Tested |
std::alignment_of |
Tested |
Tested |
Tested |
std::is_arithmetic |
Tested |
Tested |
Tested |
std::is_fundamental |
Tested |
Tested |
Tested |
std::is_reference |
Tested |
Tested |
Tested |
std::is_object |
Tested |
Tested |
Tested |
std::is_scalar |
Tested |
Tested |
Tested |
std::is_compound |
Tested |
Tested |
Tested |
std::is_member_pointer |
Tested |
Tested |
Tested |
std::is_const |
Tested |
Tested |
Tested |
std::is_assignable |
Tested |
Tested |
Tested |
std::is_constructible |
Tested |
Tested |
Tested |
std::is_copy_assignable |
Tested |
Tested |
Tested |
std::is_copy_constructible |
Tested |
Tested |
Tested |
std::is_default_constructible |
Tested |
Tested |
Tested |
std::is_destructible |
Tested |
Tested |
Tested |
std::is_empty |
Tested |
Tested |
Tested |
std::is_literal_type |
Tested |
Tested |
Tested |
std::is_move_assignable |
Tested |
Tested |
Tested |
std::is_move_constructible |
Tested |
Tested |
Tested |
std::is_pod |
Tested |
Tested |
Tested |
std::is_signed |
Tested |
Tested |
Tested |
std::is_standard_layout |
Tested |
Tested |
Tested |
std::is_trivial |
Tested |
Tested |
Tested |
std::is_unsigned |
Tested |
Tested |
Tested |
std::is_volatile |
Tested |
Tested |
Tested |
std::is_trivially_assignable |
Tested |
Tested |
Tested |
std::is_trivially_constructible |
Tested |
Tested |
Tested |
std::is_trivially_copyable |
Tested |
Tested |
Tested |
std::array |
Tested |
Tested |
Tested |
std::ratio |
Tested |
Tested |
Tested |
std::complex |
Tested |
Tested |
Tested |
std::abs |
Tested |
Tested |
Tested |
std::arg |
Tested |
Tested |
Tested |
std::conj |
Tested |
Tested |
Tested |
std::exp |
Tested |
Tested |
Tested |
std::imag |
Tested |
Tested |
Tested |
std::norm |
Tested |
Tested |
Tested |
std::polar |
Tested |
Tested |
Tested |
std::proj |
Tested |
Tested |
Tested |
std::real |
Tested |
Tested |
Tested |
std::assert |
Tested |
Tested |
Tested |
std::sin |
Tested |
Tested |
Tested |
std::cos |
Tested |
Tested |
Tested |
std::tan |
Tested |
Tested |
Tested |
std::asin |
Tested |
Tested |
Tested |
std::acos |
Tested |
Tested |
Tested |
std::atan |
Tested |
Tested |
Tested |
std::atan2 |
Tested |
Tested |
Tested |
std::sinh |
Tested |
Tested |
Tested |
std::cosh |
Tested |
Tested |
Tested |
std::tanh |
Tested |
Tested |
Tested |
std::asinh |
Tested |
Tested |
Tested |
std::acosh |
Tested |
Tested |
Tested |
std::atanh |
Tested |
Tested |
Tested |
std::exp |
Tested |
Tested |
Tested |
std::frexp |
Tested |
Tested |
Tested |
std::ldexp |
Tested |
Tested |
Tested |
std::log |
Tested |
Tested |
Tested |
std::log10 |
Tested |
Tested |
Tested |
std::modf |
Tested |
Tested |
Tested |
std::exp2 |
Tested |
Tested |
Tested |
std::expm1 |
Tested |
Tested |
Tested |
std::ilogb |
Tested |
Tested |
Tested |
std::log1p |
Tested |
Tested |
Tested |
std::log2 |
Tested |
Tested |
Tested |
std::logb |
Tested |
Tested |
Tested |
std::pow |
Tested |
Tested |
Tested |
std::sqrt |
Tested |
Tested |
Tested |
std::cbrt |
Tested |
Tested |
Tested |
std::hypot |
Tested |
Tested |
Tested |
std::erf |
Tested |
Tested |
Tested |
std::erfc |
Tested |
Tested |
Tested |
std::tgamma |
Tested |
Tested |
Tested |
std::lgamma |
Tested |
Tested |
Tested |
std::fmod |
Tested |
Tested |
Tested |
std::remainder |
Tested |
Tested |
Tested |
std::remquo |
Tested |
Tested |
Tested |
std::nextafter |
Tested |
Tested |
Tested |
std::nearbyint |
Tested |
Tested |
Tested |
std::nearbyintf |
Tested |
Tested |
Tested |
std::fdim |
Tested |
Tested |
Tested |
std::optional |
Tested |
Tested |
Tested |
std::reduce |
Tested |
Tested |
Tested |
std::all_of |
Tested |
Tested |
Tested |
std::any_of |
Tested |
Tested |
Tested |
std::none_of |
Tested |
Tested |
Tested |
std::count |
Tested |
Tested |
Tested |
std::count_if |
Tested |
Tested |
Tested |
std::for_each |
Tested |
Tested |
Tested |
std::find |
Tested |
Tested |
Tested |
std::find_if |
Tested |
Tested |
Tested |
std::find_if_not |
Tested |
Tested |
Tested |
std::for_each_n |
Tested |
Tested |
Tested |
std::ceil |
Tested |
Tested |
Tested |
std::copy |
Tested |
Tested |
Tested |
std::copy_backward |
Tested |
Tested |
Tested |
std::copy_if |
Tested |
Tested |
Tested |
std::copy_n |
Tested |
Tested |
Tested |
std::copysign |
Tested |
Tested |
Tested |
std::copysignf |
Tested |
Tested |
Tested |
std::fabs |
Tested |
Tested |
Tested |
std::is_permutation |
Tested |
Tested |
Tested |
std::fill |
Tested |
Tested |
Tested |
std::fill_n |
Tested |
Tested |
Tested |
std::floor |
Tested |
Tested |
Tested |
std::fmax |
Tested |
Tested |
Tested |
std::fmaxf |
Tested |
Tested |
Tested |
std::fmin |
Tested |
Tested |
Tested |
std::fminf |
Tested |
Tested |
Tested |
std::move |
Tested |
Tested |
Tested |
std::move_backward |
Tested |
Tested |
Tested |
std::is_sorted |
Tested |
Tested |
Tested |
std::is_sorted_until |
Tested |
Tested |
Tested |
std::isgreater |
Tested |
Tested |
Tested |
std::isgreaterequal |
Tested |
Tested |
Tested |
std::isinf |
Tested |
Tested |
Tested |
std::isless |
Tested |
Tested |
Tested |
std::islessequal |
Tested |
Tested |
Tested |
std::isnan |
Tested |
Tested |
Tested |
std::isunordered |
Tested |
Tested |
Tested |
std::partial_sort |
Tested |
Tested |
Tested |
std::partial_sort_copy |
Tested |
Tested |
Tested |
std::is_heap |
Tested |
Tested |
Tested |
std::is_heap_until |
Tested |
Tested |
Tested |
std::make_heap |
Tested |
Tested |
Tested |
std::max |
Tested |
Tested |
Tested |
std::min |
Tested |
Tested |
Tested |
std::nan |
Tested |
Tested |
Tested |
std::nanf |
Tested |
Tested |
Tested |
std::numeric_limits<T>::infinity |
Tested |
Tested |
Tested |
std::numeric_limits<T>::lowest |
Tested |
Tested |
Tested |
std::numeric_limits<T>::max |
Tested |
Tested |
Tested |
std::numeric_limits<T>::quiet_NaN |
Tested |
Tested |
Tested |
std::push_heap |
Tested |
Tested |
Tested |
std::pop_heap |
Tested |
Tested |
Tested |
std::generate |
Tested |
Tested |
Tested |
std::generate_n |
Tested |
Tested |
Tested |
std::transform |
Tested |
Tested |
Tested |
std::round |
Tested |
Tested |
Tested |
std::roundf |
Tested |
Tested |
Tested |
std::trunc |
Tested |
Tested |
Tested |
std::truncf |
Tested |
Tested |
Tested |
These tests were done for the following versions of the standard C++ library:
libstdc++ (GNU) |
Provided with GCC* 8.4.0, GCC 9.3.0, GCC 11.4.0, GCC 13.2.0 |
libc++ (LLVM) |
Provided with Clang* 11.0, Clang 14.0, Clang 17.0, Clang 18.1 |
Microsoft Visual C++* (MSVC) Standard Library |
Provided with Microsoft Visual Studio 2019 and Microsoft Visual Studio 2022. |