oneAPI 1.3 暫定仕様書 Rev. 1 の解説 (41)

その他

この記事は、https://www.oneapi.io/spec/ で 2023年9月14日に公開された『oneAPI 1.3 Provisional Specification Rev. 1』 (HTMLPDF) をベースにしています。原文は2000 ページ近くあり、翻訳の時間とリソースも限られるため、全文翻訳ではなく、記事形式で区切った仕様とその解説を提供することにしました。


この回では、『oneAPI 1.3 Provisional Specification Rev. 1』の「oneDAL」の「Accessors」の節を取り上げています。

この節では、アクセサーの実装要件を定義し、いくつかのアクセサータイプを紹介します。

要件

アクセサーの実装は以下を行います。

  1. アクセス用に単一のデータ形式を定義します。すべてのアクセサータイプは 1 つのデータ形式のみを返し使用します。
  2. テーブルタイプのデータへの読み取り専用アクセスを提供します。
  3. テーブルから値を取得する pull() メソッドを提供します。
  4. 軽量である必要があります。コンストラクターは、データのコピー、読み取り、変換などの計算集約型の操作を行ってはなりません。これらの操作は pull() メソッドによってのみ可能です。アクセサーのコピーおよび移動コンストラクターのサポートは、ローカルスコープで使用できるように設計されているため、作成された場所で直接使用できます。
  5. pull() メソッドは、テーブル内のメモリーブロックへのポインターを返すことができる場合、データのコピーと変換を回避する必要があります。これは、テーブル内のデータ形式およびデータタイプが、アクセスのデータ形式およびデータタイプと同じである場合に適用されます。

アクセサータイプ

oneDAL は一連のアクセサークラスを定義します。各クラスは、テーブルからデータを取得する特定の方法をサポートします。

以下に oneDAL におけるすべてのアクセサークラスを示します。

アクセサータイプ 説明 サポートされるタイプのリスト
行アクセサー 行範囲のアクセスを連続した同種のメモリーブロックとして提供します。 homogen table (英語)
列アクセサー 列範囲のアクセスを連続した同種のメモリーブロックとして提供します。 homogen table (英語)

列アクセサー

column_accessor クラスは、連続した同種の配列として、テーブル (英語) の列への読み取り専用アクセスを提供します。

使用例

#include <CL/sycl.hpp>
#include <iostream>

#include "oneapi/dal/table/homogen.hpp"
#include "oneapi/dal/table/column_accessor.hpp"

using namespace oneapi;

int main() {
   sycl::queue queue { sycl::default_selector() };

   constexpr float host_data[] = {
      1.0f, 1.5f, 2.0f,
      2.1f, 3.2f, 3.7f,
      4.0f, 4.9f, 5.0f,
      5.2f, 6.1f, 6.2f
   };

   constexpr std::int64_t row_count = 4;
   constexpr std::int64_t column_count = 3;

   auto shared_data = sycl::malloc_shared<float>(row_count * column_count, queue);
   auto event = queue.memcpy(shared_data, host_data, sizeof(float) * row_count * column_count);
   auto t = dal::homogen_table::wrap(queue, data, row_count, column_count, { event });

   // Accessing whole elements in a first column
   dal::column_accessor<const float> acc { t };

   auto block = acc.pull(queue, 0);
   for(std::int64_t i = 0; i < block.get_count(); i++) {
      std::cout << block[i] << ", ";
   }
   std::cout << std::endl;

   sycl::free(shared_data, queue);
   return 0;
}

プログラミング・インターフェイス

この節のすべてのタイプと関数は、oneapi::dal 名前空間で宣言され、oneapi/dal/table/column_accessor.hpp ヘッダーファイルをインクルードして使用できます。

template <typename Data>
class column_accessor {
public:
    using data_t = std::remove_const_t<Data>;

public:
    column_accessor(const table& obj);

    array<data_t> pull(sycl::queue& queue,
                       std::int64_t column_index,
                       const range& rows             = { 0, -1 },
                       const sycl::usm::alloc& alloc = sycl::usm::alloc::shared) const;

    Data* pull(sycl::queue& queue,
            array<data_t>& block,
            std::int64_t column_index,
            const range& rows             = { 0, -1 },
            const sycl::usm::alloc& alloc = sycl::usm::alloc::shared) const;
};

テンプレート、パブリックメソッド、コンストラクターについては、こちら (英語) を参照してください。

行アクセサー

row_accessor クラスは、連続した同種の配列として、テーブル (英語) の列への読み取り専用アクセスを提供します。

使用例

#include <CL/sycl.hpp>
#include <iostream>

#include "oneapi/dal/table/homogen.hpp"
#include "oneapi/dal/table/row_accessor.hpp"

using namespace oneapi;

int main() {
   sycl::queue queue { sycl::default_selector() };

   constexpr float host_data[] = {
      1.0f, 1.5f, 2.0f,
      2.1f, 3.2f, 3.7f,
      4.0f, 4.9f, 5.0f,
      5.2f, 6.1f, 6.2f
   };

   constexpr std::int64_t row_count = 4;
   constexpr std::int64_t column_count = 3;

   auto shared_data = sycl::malloc_shared<float>(row_count * column_count, queue);
   auto event = queue.memcpy(shared_data, host_data, sizeof(float) * row_count * column_count);
   auto t = dal::homogen_table::wrap(queue, data, row_count, column_count, { event });

   // Accessing second and third rows of the table
   dal::row_accessor<const float> acc { t };

   auto block = acc.pull(queue, {1, 3});
   for(std::int64_t i = 0; i < block.get_count(); i++) {
      std::cout << block[i] << ", ";
   }
   std::cout << std::endl;

   sycl::free(shared_data, queue);
   return 0;
}

プログラミング・インターフェイス

この節のすべてのタイプと関数は、oneapi::dal 名前空間で宣言され、oneapi/dal/table/row_accessor.hpp ヘッダーファイルをインクルードして使用できます。

template <typename Data>
class row_accessor {
public:
    using data_t = std::remove_const_t<Data>;

public:
    row_accessor(const table& obj);

    array<data_t> pull(sycl::queue& queue,
                       const range& rows             = { 0, -1 },
                       const sycl::usm::alloc& alloc = sycl::usm::alloc::shared) const;

    Data* pull(sycl::queue& queue,
            array<data_t>& block,
            const range& rows             = { 0, -1 },
            const sycl::usm::alloc& alloc = sycl::usm::alloc::shared) const;
};

テンプレート、パブリックメソッド、コンストラクターについては、こちら (英語) を参照してください。


法務上の注意書き

The content of this oneAPI Specification is licensed under the Creative Commons Attribution 4.0 International License (英語). Unless stated otherwise, the sample code examples in this document are released to you under the MIT license (英語).

This specification is a continuation of Intel’s decades-long history of working with standards groups and industry/academia initiatives such as The Khronos Group*, to create and define specifications in an open and fair process to achieve interoperability and interchangeability. oneAPI is intended to be an open specification and we encourage you to help us make it better. Your feedback is optional, but to enable Intel to incorporate any feedback you may provide to this specification, and to further upstream your feedback to other standards bodies, including The Khronos Group SYCL* specification, please submit your feedback under the terms and conditions below. Any contribution of your feedback to the oneAPI Specification does not prohibit you from also contributing your feedback directly to other standard bodies, including The Khronos Group under their respective submission policies.

By opening an issue, providing feedback, or otherwise contributing to the specification, you agree that Intel will be free to use, disclose, reproduce, modify, license, or otherwise distribute your feedback at its sole discretion without any obligations or restrictions of any kind, including without limitation, intellectual property rights or licensing obligations.

This document contains information on products, services and/or processes in development. All information provided here is subject to change without notice.

© Intel Corporation. Intel、インテル、Intel ロゴ、その他のインテルの名称やロゴは、Intel Corporation またはその子会社の商標です。

* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

« パート 40        目次
タイトルとURLをコピーしました