英特尔 oneAPI,它是一种开源的跨架构编程模型和工具套件,旨在方便高性能计算、人工智能和通用计算应用程序的开发。oneAPI 不仅支持 CPU 架构,还可针对 GPU、FPGA 和其他协处理器进行优化编程,实现设备间的无缝协同。其目标是提供一种简单易用的跨硬件体系结构的并行编程模型,以便开发人员能够更轻松地编写能在各种硬件上运行的性能优异的代码。
首先,要使用英特尔 oneAPI 工具套件,需要先下载和安装 Intel® oneAPI 工具集,包括 Intel® oneAPI Base 包和适用于特定硬件加速的工具包(例如,Intel® oneAPI DPC++/C++ 编译器)。
对于下面的示例,我们将使用 DPC++ 编程模型,该模型支持 GPU、CPU 和 FPGA 加速。
本例将利用向量加法计算两个向量之和。在 CPU 和 GPU 上运行时顺序执行,在 FPGA 上运行时使用流水线并发执行。
以下是几个步骤:
1.定义向量 add 函数。
void vector_add(int *vec_a, int *vec_b, int *vec_c, int n) {
for (int i = 0; i < n; ++i) {
vec_c[i]=vec_a[i] + vec_b[i];
}
}
接下来我们将使用 DPC++ 语言来执行该函数。DPC++ 是 C++ 和 SYCL 的扩展版本,允许使用 C++ 和 SYCL 代码与高级数据并行编程进行交互。让我们定义向量加法内核,并使用“parallel_for”命令控制并行执行:
#include <CL/sycl.hpp>
using namespace cl::sycl;
class vector_add_kernel;
void vector_add(int *vec_a, int *vec_b, int *vec_c, int n) {
queue q;
buffer<int> a(vec_a, range(n));
buffer<int> b(vec_b, range(n));
buffer<int> c(vec_c, range(n));
q.submit([&](handler &h) {
accessor A(a, h, read_only);
accessor B(b, h, read_only);
accessor C(c, h, write_only);
h.parallel_for<vector_add_kernel>(
range<1>(n), [=](id<1> i) { C[i] = A[i] + B[i]; });
}).wait();
}
上述核心使用并行编程,将 add 函数分解为许多独立计算任务。vector_add_kernel 类表示内核,queue 对象表示由 DPC++ 控制的队列。然后通过使用 three buffer objects(a、b 和 c)来读取输入和输出数据,并将此内核提交给队列以保证执行。
2.定义主函数。
#include <cstdlib>
int main() {
const int n = 1024;
int *a = (int *)malloc(sizeof(int) * n);
int *b = (int *)malloc(sizeof(int) * n);
int *c = (int *)malloc(sizeof(int) * n);
for (int i = 0; i < n; ++i) {
a[i] = i;
b[i] = 2 * i;
}
vector_add(a, b, c, n);
for (int i = 0; i < n; ++i)
std::cout << c[i] << " ";
free(a);
free(b);
free(c);
return 0;
}
在主函数中,首先定义了 n,a、b 和 c 数组。然后把 a 和 b 初始化,将计算结果存储在 c 中,最后释放分配的内存。向量加法的输出结果应为累加两个向量的元素。
现在我们已经准备好运行这个 DPC++ 程序。接下来使用 Intel® DevCloud for oneAPI 提交应用程序。
3.在 Intel® DevCloud for oneAPI 上提交该应用程序。
在命令行窗口中输入:
qsub -l nodes=1:gpu:ppn=2 -d . vector_add.cpp
这还告诉管理器要为我们推荐一个节点来运行我们的作业。
4.执行该应用程序。
等待几分钟,直到作业完成。一旦您的作业已完成并显示了所有输出,就可以退出其 shell 会话:
qstat -u $USER
# output shows your jobs...
qdel jobid
上述内容是实现向量加法的示例。
通过上述实现方式,我们可以成功加速计算,同时能够选择不同的硬件加速平台,例如 CPU、GPU 或 FPGA,以实现更高效的计算。