英特尔oneAPI—跨架构实现高效率

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

什么是oneAPI?

举几个发生在我们身边的情景:我们经常在电脑上办公时临时有事,需要外出处理事情,这个时候我们就会将正在处理的办公事务转移到手机上进行;任何从边缘到云端的应用程序;亦或者是我们会在一个app上看感兴趣的电视,只要我们的电视、电脑、手机上都安装了这个app,我们就能做到多设备连续性的体验。就我们目前正在处理的各种各样的工作负载而言,这是一个令人惊叹的了不起的时代。这些事例都需要一套多样化的架构。在这个时代,我们见证了各种设备和硅片加速器的爆炸式增长。如果我想在云端同时处理1000个处理器,亦或者是利用无人机进行人脸识别。这些加速器,每一个都有自己的库和工具、或者是一个独特的编程模型。这使得它们之间跨架构重用代码并高效工作具有很大的挑战性。为了使开发人员能够以最佳性能实现这种连续体验,有时候必须以java、c++、python和其他语言来编写和重写几乎相同的代码,在多个操作系统上进行编译,有时使用完全不同的API、库、SDK,整个过程中产生大量的系统开销,使我们不能专注于算法和创新。oneAPI的大胆愿景是在为你提供所需的所有性能的同时,拥有一个跨架构,跨供应商的软件可移植性。因此,无论你的系统配备了什么设备和加速器,或者是,这些设备各自使用的是什么语言和库,利用什么中间件或者框架等等,oneAPI都能够桥接、抽象所有的这些设备,并使其具有一个共通点。在这里,可以共享内存空间、代码可以被移植并重新利用、工具可以跨架构使用。oneAPI的行业范围规范定义了软件栈内部的底层抽象层你可以将优化的库集中用于各个领域。

初探DPC++

让我们看一段DPC++示例代码:

#include <CL/sycl.hpp>
constexpr int N = 16;
using namespace sycl;

class IntelGPUSelector : public device_selector {
public:
int operator()(const device& Device) const override {
const std::string DeviceName = Device.get_infoinfo::device::name();
const std::string DeviceVendor = Device.get_infoinfo::device::vendor();
return Device.is_gpu() && (DeviceName.find("Intel") != std::string::npos) ? 100 : 0;
}
};

int main() {
IntelGPUSelector d;
queue q(d);
int* data = malloc_shared(N, q);
q.parallel_for(N, [=](auto i) {
data[i] = i;
}).wait();
for (int i = 0; i < N; i++) std::cout << data[i] << " ";
free(data, q);
}

IntelGPUSelector是一个继承了device_selector的设备选择器,其中device_selector是纯虚类,它有个纯虚函数int operator()(const device& Device) const需要派生类来实现,该函数会遍历计算机上的计算设备,并且返回使用设备的优先级,返回数字越高优先级越高,这里选择Intel的GPU作为首选的计算设备,注意这个函数使用了override来说明其目的是覆盖虚函数。queue的目的是指定工作的目标位置,这里设置的是Intel的GPU。

DPC++的数据管理模块代码示例

1.explicit_data_movement.cpp

代码如下(示例):

#include <CL/sycl.hpp>
#include<array>
using namespace sycl;
constexpr int N = 42;

int main() {
  queue Q;

  std::array<int,N> host_array;
  int *device_array = malloc_device<int>(N, Q);

  for (int i = 0; i < N; i++)
    host_array[i] = N;

  // We will learn how to simplify this example later
  Q.submit([&](handler &h) {
      // copy hostArray to deviceArray
      h.memcpy(device_array, &host_array[0], N * sizeof(int));
    });
  Q.wait();

  Q.submit([&](handler &h) {
      h.parallel_for(N, [=](id<1> i) { device_array[i]++; });
    });
  Q.wait();

  Q.submit([&](handler &h) {
      // copy deviceArray back to hostArray
      h.memcpy(&host_array[0], device_array, N * sizeof(int));
    });
  Q.wait();

  free(device_array, Q);
  return 0;
}

2.implicit_data_movement.cpp

代码如下(示例):

#include <CL/sycl.hpp>
using namespace sycl;
constexpr int N = 42;

int main() {
  queue Q;
  int *host_array = malloc_host<int>(N, Q);
  int *shared_array = malloc_shared<int>(N, Q);

  for (int i = 0; i < N; i++) {
    // Initialize hostArray on host
    host_array[i] = i;
  }

  // We will learn how to simplify this example later
  Q.submit([&](handler &h) {
      h.parallel_for(N, [=](id<1> i) {
          // access sharedArray and hostArray on device
          shared_array[i] = host_array[i] + 1;
        });
    });
  Q.wait();

  for (int i = 0; i < N; i++) {
    // access sharedArray on host
    host_array[i] = shared_array[i];
  }

  free(shared_array, Q);
  free(host_array, Q);
  return 0;
}

总结

oneAPI 的DPC++库可以对DPC++内核加速并优化C++的算法等。AI工具分析套件是基于oneAPI借助优化的深度学习框架和高性能python库,这些套件可以帮助加速端到端机器学习和数据科学流程。OpenVION工具套件可以加速开发具备高性能深度学习推理计算机视觉功能的视觉/AI应用它支持在硬件加速器上进行深度学习,并轻松部署到多种类型的英特尔平台上。这些强大的组件可以加快开发人员在开发的过程中的效率,使得其在开发过程中更加方便。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2022年5月18日
下一篇 2022年5月18日

相关推荐