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 <sycl/sycl.hpp>
#include <oneapi/dpl/utility>
#include <iostream>
constexpr sycl::access::mode sycl_read_write = sycl::access::mode::read_write;
class KernelSwap;
void kernel_test() {
  sycl::queue deviceQueue;
  sycl::range<1> numOfItems{2};
  sycl::cl_int swap_num[2] = {4, 5};
  std::cout << swap_num[0] << ", " << swap_num[1] << std::endl;
  {
  sycl::buffer<sycl::cl_int, 1> swap_buffer
  (swap_num, numOfItems);
  deviceQueue.submit([&](sycl::handler &cgh) {
  auto swap_accessor = swap_buffer.get_access<sycl_read_write>(cgh);
  cgh.single_task<class KernelSwap>([=]() {
      int & num1 = swap_accessor[0];
      int & num2 = swap_accessor[1];
      oneapi::dpl::swap(num1, num2);
      });
  });
  }
  std::cout << swap_num[0] << ", " << swap_num[1] << std::endl;
}
int main() {
    kernel_test();
    return 0;
} 
  Use the following command to build and run the program (assuming it resides in the kernel_swap.cpp file):
dpcpp kernel_swap.cpp -o kernel_swap.exe ./kernel_swap.exe
The printed result is:
4, 5 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*-7.5.0, GCC*-9.3.0 | 
| libc++(LLVM) | Provided with Clang*-11.0 | 
| Microsoft Visual C++* (MSVC) Standard Library | Provided with Microsoft Visual Studio* 2017; Microsoft Visual Studio 2019; and Microsoft Visual Studio 2022, version 17.0, preview 4.1. 
            NOTE: 
          Support for Microsoft Visual Studio 2017 is deprecated as of the Intel® oneAPI 2022.1 release, and will be removed in a future release. |