oneapi简介
oneapi是 Intel 推出的一个软件开发工具套件,旨在简化和加速跨多个硬件加速器的高性能计算和数据处理应用程序的开发。该套件支持包括 CPU、GPU、FPGA 等多种硬件平台。
优点主要有:
多硬件支持: One API 提供了支持 Intel 处理器、图形处理器(GPU)和可编程逻辑器件(FPGA)的 API,使开发者能够更轻松地利用各种硬件加速器的性能。
统一编程模型: One API 的目标是提供一个统一的编程模型,使开发人员能够以相似的方式开发和优化应用程序,而无需为不同的硬件平台编写不同的代码。
DPC++ 编程语言: One API 引入了 Data Parallel C++(DPC++)编程语言,它是一种基于 C++ 的语言,支持异构计算和并行性,使开发者能够更好地利用硬件加速器。
开放标准: One API 倡导开放标准,支持行业标准如 SYCL(C++ 标准库的异构并行性支持)、OpenMP 等。
核心函数为
inline void Sort(float a[], int n) {
for (int step = 0; step < n; step++) {
// for each step s, stage goes s, s-1,..., 0
for (int stage = step; stage >= 0; stage--) {
// Sequences (same size) are formed at each stage.
int num_sequence = pow(2, (n - stage - 1));
// The length of the sequences (2, 4, ...).
int sequence_len = pow(2, stage + 1);
// Call SwapElements function to perform comparisons and swaps.
SwapElements(step, stage, num_sequence, sequence_len, a);
}
}
}
step代表排序的每一轮,对应序列的长度,stage循环表示在每一轮中的阶段,num_sequnce_代表每个阶段形成的序列数量,sequence_len表示每个序列的长度。
在每个阶段和每一轮中,调用 SwapElements 函数,该函数会根据当前的 step、stage、num_sequence 和 sequence_len 来执行比较和交换操作。
在使用gpu上的核心操作为:
1.创建SYCL队列和设备信息输出
这是每一个要提交到GPU上的必经之路
queue q;
cout << "Device: " << q.get_device().get_info<info::device::name>() << "\n";
2.内存分配和数据输入
float *data_cpu = (float *)malloc(size * sizeof(float));
float *data_usm = malloc_shared<float>(size, q);
float *data_gpu = (float *)malloc(size * sizeof(float));
for (int i = 0; i < size; i++) {
float tmp;
cin >> tmp;
data_usm[i] = data_gpu[i] = data_cpu[i] = tmp;
}
3.调用并行排序的函数
ParallelSortBuffer(data_gpu,n,q)
#初始化参数
int size = pow(2, n);
float *a = data_gpu;
std::optional<event> last_event;
#循环执行排序,并计算相关常数
for (int step = 0; step < n; step++) {
for (int stage = step; stage >= 0; stage--) {
int seq_len = pow(2, stage + 1);
int two_power = 1 << (step - stage);
之后等待SYCL任务完成即可