SYCL* のサポート

フローグラフ・アナライザーは、グラフ計算の問題調査、デバッグ解析を行うインテル® Advisor の機能です。SYCL* ランタイムはワークから送信された非同期タスクのグラフを構築するため、フローグラフ・アナライザーを使用すると、非同期タスクグラフをその実行トレースを視覚化して操作できます。このツールには次の機能が含まれます。

SYCL* アプリケーションのデータ収集サポートは、現在 Linux* でのみサポートされています。

次のサンプルコードは、2 つのベクトルを加算する SYCL* アプリケーションの簡単な例を示しています。以降のセクションでは、この例を基に説明します。

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

#define VECTOR_SIZE 16384

using namespace cl::sycl;

void vec_add(queue &q, const float A[], const float B[], float C[],
             const int size) {
  // バッファーを作成
  buffer<float, 1> bufA(A, range<1>(VECTOR_SIZE));
  buffer<float, 1> bufB(B, range<1>(VECTOR_SIZE));
  buffer<float, 1> bufC(C, range<1>(VECTOR_SIZE));

  q.submit([&](handler &cgh) {
    auto Acc = bufA.get_access<access::mode::read>(cgh);
    auto Bcc = bufB.get_access<access::mode::read>(cgh);
    auto Ccc = bufC.get_access<access::mode::write>(cgh);
    cgh.parallel_for<class saxpy_kernel>(range<1>(size), [=](id<1> idx) {
      Ccc[idx[0]] = Acc[idx[0]] + Bcc[idx[0]];
    });
  });
}

int main(int argc, char **argv) {
  if (argc < 2) {
    std::cout << "Usage:- " << argv[0] << " [cpu, gpu]\n";
    return 1;
  }
  if (argc < 2) {
    std::cout << "Usage:- " << argv[0] << " [cpu, gpu]\n";
    return 1;
  }

  float A[VECTOR_SIZE], B[VECTOR_SIZE], C[VECTOR_SIZE];

  if (std::string("cpu") == argv[1]) {
    cpu_selector device;
    queue q(device);
    vec_add(q, A, B, C, VECTOR_SIZE);

  } else if (std::string("gpu") == argv[1]) {
    gpu_selector device;
    queue q(device);
    vec_add(q, A, B, C, VECTOR_SIZE);
  }

  return 0;
}