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


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

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



oneCCL API を使用した一般的なワークフローを示します。

  1. メインのビルトイン KVS を作成します。アドレスは、アウトオブバンド通信メカニズムを使用して配布し、他のプロセスで KVS を作成する際に使用されます。

    using namespace std;
    /* 例えば、MPI をアウトオブバウンドの通信メカニズムとして使用します */
    int mpi_rank, mpi_size;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
    MPI_Comm_size(MPI_COMM_WORLD, &mpi_size);
    ccl::shared_ptr_class<ccl::kvs> kvs;
    ccl::kvs::address_type kvs_addr;
    if (mpi_rank == 0) {
        kvs = ccl::create_main_kvs();
        kvs_addr = kvs->get_address();
        MPI_Bcast((void*), ccl::kvs::address_max_size, MPI_BYTE, 0, MPI_COMM_WORLD);
    else {
        MPI_Bcast((void*), ccl::kvs::address_max_size, MPI_BYTE, 0, MPI_COMM_WORLD);
        kvs = ccl::create_kvs(kvs_addr);
  2. コミュニケーターを作成します。

    /* ホスト通信 */
    auto comm = ccl::create_communicator(mpi_size, mpi_rank, kvs);
    /* SYCL* デバイスは、プロセスごとに複数のデバイスと通信します */
    /* sycl_context -> sycl::context */
    /* sycl_devices -> vector<sycl::device> */
    /* sycl_queues  -> vector<sycl::queue> */
    /* create ccl::context object from sycl::context object */
    auto ccl_context = ccl::create_context(sycl_context);
    /* sycl::device オブジェクトから ccl::device オブジェクトを作成します */
    vector<ccl::device> ccl_devices;
    for (size_t idx = 0; idx <sycl_devices.size(); idx++) {
    map<int, ccl::device> r2d_map;
    for (auto& dev : ccl_devices) {
        int rank = /* 特定のデバイスに対してグローバルに一意のランクを生成します */
        r2d_map = dev;
    /* sycl::queue オブジェクトから ccl::stream オブジェクトを作成します */
    vector<ccl::stream> ccl_streams;
    for (size_t idx = 0; idx < sycl_queues.size(); idx++) {
    auto comms = ccl::create_communicators(mpi_size * r2d_map.size(),
  3. コミュニケーターで選択した通信操作を実行します。

    /* ホスト通信 */
    allreduce(..., comm).wait();
    /* SYCL* デバイス通信 */
    vector<ccl::event> events;
    for (auto& comm : comms) {
        events.push_back(allreduce(..., comm, ccl_streams[comm.rank()]));
    for (auto& e : events) {


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 またはその子会社の商標です。

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

« パート 30        目次        パート 32 »