英特尔oneAPI---跨架构实现高效率
文章目錄
- 什么是oneAPI?
- 初探DPC++
- DPC++的數據管理模塊代碼示例
- 1.explicit_data_movement.cpp
- 2.implicit_data_movement.cpp
- 總結
什么是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 laterQ.submit([&](handler &h) {// copy hostArray to deviceArrayh.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 hostArrayh.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 hosthost_array[i] = i;}// We will learn how to simplify this example laterQ.submit([&](handler &h) {h.parallel_for(N, [=](id<1> i) {// access sharedArray and hostArray on deviceshared_array[i] = host_array[i] + 1;});});Q.wait();for (int i = 0; i < N; i++) {// access sharedArray on hosthost_array[i] = shared_array[i];}free(shared_array, Q);free(host_array, Q);return 0; }總結
oneAPI 的DPC++庫可以對DPC++內核加速并優化C++的算法等。AI工具分析套件是基于oneAPI借助優化的深度學習框架和高性能python庫,這些套件可以幫助加速端到端機器學習和數據科學流程。OpenVION工具套件可以加速開發具備高性能深度學習推理計算機視覺功能的視覺/AI應用它支持在硬件加速器上進行深度學習,并輕松部署到多種類型的英特爾平臺上。這些強大的組件可以加快開發人員在開發的過程中的效率,使得其在開發過程中更加方便。
總結
以上是生活随笔為你收集整理的英特尔oneAPI---跨架构实现高效率的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: squid 折叠回源解析
- 下一篇: SANGFOR SCSA——虚拟专用网与