検証済み標準 C++ API

インテル® oneAPI DPC++ ライブラリー (インテル® oneDPL) 向けのテスト済み標準 C++ API について説明します。

C++ 標準 API の多くの基本機能は、DPC++ カーネルで検証されています。これらの API は、一般的な CPU ベースのプラットフォームのコードで使用する場合と同様に、デバイスカーネルで使用できます。検証済みの標準 C++ API は oneapi::dpl 名前空間に追加されており、対応するヘッダーがインテル® oneDPL パッケージに追加されています。oneapi::dpl 名前空間を介してこれらの API を使用するには、<oneapi/dpl/...> にあるヘッダーをインクルードする必要があります。現在、検証済みの標準 C++ API は 2 つの方法で利用できます。
  1. std:: 名前空間と標準ヘッダー (例: <utility>...) を利用する
  2. oneapi::dpl 名前空間とインテル® oneDPL ヘッダー (例: <oneapi/dpl/utility>...) を利用する

以下は、SYCL* デバイスコードでの oneapi::dpl::swap の使用例です。

#include <CL/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;
}

次のコマンドでプログラム (kernel_swap.cpp) をビルドして実行します。

dpcpp kernel_swap.cpp –o kernel_swap.exe

./kernel_swap.exe

実行結果は次のようになります。

4, 5
5, 4

検証済み標準 C++ API リファレンス

次の C++ 標準 API は、DPC++ カーネルでの使用が検証されています。

C++ 標準 API libstdc++ libc++ MSVS
std::swap 検証済み 検証済み 検証済み
std::lower_bound 検証済み 検証済み 検証済み
std::upper_bound 検証済み 検証済み 検証済み
std::binary_search 検証済み 検証済み 検証済み
std::equal_range 検証済み 検証済み 検証済み
std::tuple 検証済み 検証済み 検証済み
std::pair 検証済み 検証済み 検証済み
std::reference_wrapper 検証済み 検証済み 検証済み
std::ref/cref 検証済み 検証済み 検証済み
std::divides 検証済み 検証済み 検証済み
std::minus 検証済み 検証済み 検証済み
std::plus 検証済み 検証済み 検証済み
std::negate 検証済み 検証済み 検証済み
std::modulus 検証済み 検証済み 検証済み
std::multiplies 検証済み 検証済み 検証済み
std::equal_to 検証済み 検証済み 検証済み
std::greater 検証済み 検証済み 検証済み
std::greater_equal 検証済み 検証済み 検証済み
std::less 検証済み 検証済み 検証済み
std::less_equal 検証済み 検証済み 検証済み
std::not_equal_to 検証済み 検証済み 検証済み
std::bit_and 検証済み 検証済み 検証済み
std::bit_not 検証済み 検証済み 検証済み
std::bit_xor 検証済み 検証済み 検証済み
std::bit_or 検証済み 検証済み 検証済み
std::logical_and 検証済み 検証済み 検証済み
std::logical_or 検証済み 検証済み 検証済み
std::logical_not 検証済み 検証済み 検証済み
std::binary_negate 検証済み 検証済み 検証済み
std::unary_negate 検証済み 検証済み 検証済み
std::not1/2 検証済み 検証済み 検証済み
std::unary_function 検証済み 検証済み 検証済み
std::initializer_list 検証済み 検証済み 検証済み
std::forward 検証済み 検証済み 検証済み
std::move 検証済み 検証済み 検証済み
std::move_if_noexcept 検証済み 検証済み 検証済み
std::integral_constant 検証済み 検証済み 検証済み
std::is_same 検証済み 検証済み 検証済み
std::is_base_of 検証済み 検証済み 検証済み
std::is_base_of_union 検証済み 検証済み 検証済み
std::is_convertible 検証済み 検証済み 検証済み
std::extent 検証済み 検証済み 検証済み
std::rank 検証済み 検証済み 検証済み
std::remove_all_extents 検証済み 検証済み 検証済み
std::remove_extent 検証済み 検証済み 検証済み
std::add_const 検証済み 検証済み 検証済み
std::add_cv 検証済み 検証済み 検証済み
std::add_volatile 検証済み 検証済み 検証済み
std::remove_const 検証済み 検証済み 検証済み
std::remove_cv 検証済み 検証済み 検証済み
std::remove_volatile 検証済み 検証済み 検証済み
std::decay 検証済み 検証済み 検証済み
std::conditional 検証済み 検証済み 検証済み
std::enable_if 検証済み 検証済み 検証済み
std::common_type 検証済み 検証済み 検証済み
std::declval 検証済み 検証済み 検証済み
std::alignment_of 検証済み 検証済み 検証済み
std::is_arithmetic 検証済み 検証済み 検証済み
std::is_fundamental 検証済み 検証済み 検証済み
std::is_reference 検証済み 検証済み 検証済み
std::is_object 検証済み 検証済み 検証済み
std::is_scalar 検証済み 検証済み 検証済み
std::is_compound 検証済み 検証済み 検証済み
std::is_member_pointer 検証済み 検証済み 検証済み
std::is_const 検証済み 検証済み 検証済み
std::is_assignable 検証済み 検証済み 検証済み
std::is_constructible 検証済み 検証済み 検証済み
std::is_copy_assignable 検証済み 検証済み 検証済み
std::is_copy_constructible 検証済み 検証済み 検証済み
std::is_default_constructible 検証済み 検証済み 検証済み
std::is_destructible 検証済み 検証済み 検証済み
std::is_empty 検証済み 検証済み 検証済み
std::is_literal_type 検証済み 検証済み 検証済み
std::is_move_assignable 検証済み 検証済み 検証済み
std::is_move_constructible 検証済み 検証済み 検証済み
std::is_pod 検証済み 検証済み 検証済み
std::is_signed 検証済み 検証済み 検証済み
std::is_standard_layout 検証済み 検証済み 検証済み
std::is_trivial 検証済み 検証済み 検証済み
std::is_unsigned 検証済み 検証済み 検証済み
std::is_volatile 検証済み 検証済み 検証済み
std::is_trivially_assignable 検証済み 検証済み 検証済み
std::is_trivially_constructible 検証済み 検証済み 検証済み
std::is_trivially_copyable 検証済み 検証済み 検証済み
std::array 検証済み 検証済み 検証済み
std::ratio 検証済み 検証済み 検証済み
std::complex 検証済み   検証済み
std::assert 検証済み 検証済み 検証済み
std::sin 検証済み 検証済み 検証済み
std::cos 検証済み 検証済み 検証済み
std::tan 検証済み 検証済み 検証済み
std::asin 検証済み 検証済み 検証済み
std::acos 検証済み 検証済み 検証済み
std::atan 検証済み 検証済み 検証済み
std::atan2 検証済み 検証済み 検証済み
std::sinh 検証済み 検証済み 検証済み
std::cosh 検証済み 検証済み 検証済み
std::tanh 検証済み 検証済み 検証済み
std::asinh 検証済み 検証済み 検証済み
std::acosh 検証済み 検証済み 検証済み
std::atanh 検証済み 検証済み 検証済み
std::exp 検証済み 検証済み 検証済み
std::frexp 検証済み 検証済み 検証済み
std::ldexp 検証済み 検証済み 検証済み
std::log 検証済み 検証済み 検証済み
std::log10 検証済み 検証済み 検証済み
std::modf 検証済み 検証済み 検証済み
std::exp2 検証済み 検証済み 検証済み
std::expm1 検証済み 検証済み 検証済み
std::ilogb 検証済み 検証済み 検証済み
std::log1p 検証済み 検証済み 検証済み
std::log2 検証済み 検証済み 検証済み
std::logb 検証済み 検証済み 検証済み
std::pow 検証済み 検証済み 検証済み
std::sqrt 検証済み 検証済み 検証済み
std::cbrt 検証済み 検証済み 検証済み
std::hypot 検証済み 検証済み 検証済み
std::erf 検証済み 検証済み 検証済み
std::erfc 検証済み 検証済み 検証済み
std::tgamma 検証済み 検証済み 検証済み
std::lgamma 検証済み 検証済み 検証済み
std::fmod 検証済み 検証済み 検証済み
std::remainder 検証済み 検証済み 検証済み
std::remquo 検証済み 検証済み 検証済み
std::nextafter 検証済み 検証済み 検証済み
std::fdim 検証済み 検証済み 検証済み
std::optional 検証済み 検証済み 検証済み

これらのテストは、標準 C++ ライブラリーの次のバージョンで実施されました。

標準 C++ ライブラリー バージョン
libstdc++ (GNU*) GCC 7.5.0 に含まれる
libc++ (LLVM) Clang 11.0 に含まれる
MSVC 標準 C++ ライブラリー Microsoft* Visual Studio* 2017 に含まれる