英特尔oneAPI---跨架构实现高效率
文章目錄
- 什么是oneAPI?
- 初探DPC++
- DPC++的數(shù)據(jù)管理模塊代碼示例
- 1.explicit_data_movement.cpp
- 2.implicit_data_movement.cpp
- 總結(jié)
什么是oneAPI?
舉幾個(gè)發(fā)生在我們身邊的情景:我們經(jīng)常在電腦上辦公時(shí)臨時(shí)有事,需要外出處理事情,這個(gè)時(shí)候我們就會(huì)將正在處理的辦公事務(wù)轉(zhuǎn)移到手機(jī)上進(jìn)行;任何從邊緣到云端的應(yīng)用程序;亦或者是我們會(huì)在一個(gè)app上看感興趣的電視,只要我們的電視、電腦、手機(jī)上都安裝了這個(gè)app,我們就能做到多設(shè)備連續(xù)性的體驗(yàn)。就我們目前正在處理的各種各樣的工作負(fù)載而言,這是一個(gè)令人驚嘆的了不起的時(shí)代。這些事例都需要一套多樣化的架構(gòu)。在這個(gè)時(shí)代,我們見證了各種設(shè)備和硅片加速器的爆炸式增長(zhǎng)。如果我想在云端同時(shí)處理1000個(gè)處理器,亦或者是利用無人機(jī)進(jìn)行人臉識(shí)別。這些加速器,每一個(gè)都有自己的庫(kù)和工具、或者是一個(gè)獨(dú)特的編程模型。這使得它們之間跨架構(gòu)重用代碼并高效工作具有很大的挑戰(zhàn)性。為了使開發(fā)人員能夠以最佳性能實(shí)現(xiàn)這種連續(xù)體驗(yàn),有時(shí)候必須以java、c++、python和其他語言來編寫和重寫幾乎相同的代碼,在多個(gè)操作系統(tǒng)上進(jìn)行編譯,有時(shí)使用完全不同的API、庫(kù)、SDK,整個(gè)過程中產(chǎn)生大量的系統(tǒng)開銷,使我們不能專注于算法和創(chuàng)新。oneAPI的大膽愿景是在為你提供所需的所有性能的同時(shí),擁有一個(gè)跨架構(gòu),跨供應(yīng)商的軟件可移植性。因此,無論你的系統(tǒng)配備了什么設(shè)備和加速器,或者是,這些設(shè)備各自使用的是什么語言和庫(kù),利用什么中間件或者框架等等,oneAPI都能夠橋接、抽象所有的這些設(shè)備,并使其具有一個(gè)共通點(diǎn)。在這里,可以共享內(nèi)存空間、代碼可以被移植并重新利用、工具可以跨架構(gòu)使用。oneAPI的行業(yè)范圍規(guī)范定義了軟件棧內(nèi)部的底層抽象層你可以將優(yōu)化的庫(kù)集中用于各個(gè)領(lǐng)域。
初探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是一個(gè)繼承了device_selector的設(shè)備選擇器,其中device_selector是純虛類,它有個(gè)純虛函數(shù)int operator()(const device& Device) const需要派生類來實(shí)現(xiàn),該函數(shù)會(huì)遍歷計(jì)算機(jī)上的計(jì)算設(shè)備,并且返回使用設(shè)備的優(yōu)先級(jí),返回?cái)?shù)字越高優(yōu)先級(jí)越高,這里選擇Intel的GPU作為首選的計(jì)算設(shè)備,注意這個(gè)函數(shù)使用了override來說明其目的是覆蓋虛函數(shù)。queue的目的是指定工作的目標(biāo)位置,這里設(shè)置的是Intel的GPU。
DPC++的數(shù)據(jù)管理模塊代碼示例
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; }總結(jié)
oneAPI 的DPC++庫(kù)可以對(duì)DPC++內(nèi)核加速并優(yōu)化C++的算法等。AI工具分析套件是基于oneAPI借助優(yōu)化的深度學(xué)習(xí)框架和高性能python庫(kù),這些套件可以幫助加速端到端機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)流程。OpenVION工具套件可以加速開發(fā)具備高性能深度學(xué)習(xí)推理計(jì)算機(jī)視覺功能的視覺/AI應(yīng)用它支持在硬件加速器上進(jìn)行深度學(xué)習(xí),并輕松部署到多種類型的英特爾平臺(tái)上。這些強(qiáng)大的組件可以加快開發(fā)人員在開發(fā)的過程中的效率,使得其在開發(fā)過程中更加方便。
總結(jié)
以上是生活随笔為你收集整理的英特尔oneAPI---跨架构实现高效率的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: squid 折叠回源解析
- 下一篇: SANGFOR SCSA——虚拟专用网与