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 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:

  1. Via the namespace std:: and standard headers (for example: <utility>...)

  2. 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 1

std::lower_bound

Tested

Tested

std::upper_bound

Tested

Tested

std::binary_search

Tested

Tested

std::equal_range

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 1

std::ratio

Tested

Tested

Tested

std::complex

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

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

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

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 1

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 1

std::is_sorted_until

Tested

Tested

Tested 1

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 1

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

The testing was conducted for the following versions of the C++ standard libraries, with the help of the listed compilers:

C++ Standard Library

C++ Standard Library Version

SYCL Compiler Used

libstdc++ (GNU)

Provided with GCC* 8.4.0, GCC 9.3.0, GCC 11.4.0, GCC 13.2.0, GCC 15.2.0

Intel® oneAPI DPC++/C++ Compiler

Microsoft Visual C++* (MSVC) Standard Library

Provided with Microsoft Visual Studio 2019, Microsoft Visual Studio 2022 and Microsoft Visual Studio 2026

Intel® oneAPI DPC++/C++ Compiler

libc++ (LLVM)

Provided with Clang* 18.1, Clang 19.1, Clang 20.1

AdaptiveCpp

1(1,2,3,4,5,6)

The API has been tested with _USE_STD_VECTOR_ALGORITHMS macro defined as 0 to disable manual vectorization in some MSVC STL algorithms and functions, which is not allowed in SYCL device code. It includes algorithms described in Vectorized MSVC STL Algorithms as well as std::swap and comparison operators applied to std::array objects.