Oneapi应用——并行排序实践

Oneapi应用——并行排序实践

oneapi简介

One API 是 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 等。

当然对于学生党来说最幸福的是可以白嫖intel的GPU资源进行训练

one api使用

基本工具包示例 |英特尔® DevCloud (intel.com)

适用于 Windows 的 OpenSSH 入门 | Microsoft Learn

首先用openssh连接到DevCloud,然后运行Hello World样本(这里的样本并不是hello world,而是vector add,难度近似),但由于官方给出的文档并没有进行编译,因此需要自行编译后再运行

Solved: Re: Vectoradd build error - Intel Community

笔者尝试过openssh+wins terminal或jupyter进行连接,两者都比较方便,只是jupyter上手更快,建议懒的初学者直接使用jupyter

并行排序算法实践

在这里插入图片描述

核心函数为

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 函数,该函数会根据当前的 stepstagenum_sequencesequence_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);

    ParallelSort(data_usm, n, q);

    ParallelSort(data_usm, 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并行执行排序

    last_event = q.submit([&](auto &h) {
      if (last_event.has_value())
        h.depends_on(last_event.value());
      h.parallel_for(range<1>(size), [=](id<1> i) {
        // 一些计算和排序的逻辑
      });
    });
    
    
  • 加入排序逻辑(这一块代码太多了就不放了

  • 等待SYCL任务完成即可

q.wait();

运行代码

在第二节one api使用中的链接可以看到官方的运行代码教程

  • 在gpu节点上建立任务

qsub build.sh

当任务建立完成后,将会在目录下看到build.sh.oxxx文件,则可以执行代码任务

  • 运行程序

qsub run.sh

其中build.sh为:

#!/bin/bash

#PBS -l nodes=1:gpu:ppn=2
#PBS -d .

source /opt/intel/oneapi/setvars.sh >

echo
echo start: $(date "+%y/%m/%d %H:%M:%S.%3N")
echo

make all

echo
echo stop: $(date "+%y/%m/%d %H:%M:%S.%3N")
echo

run.sh为:

#!/bin/bash

#PBS -l nodes=1:gpu:ppn=2
#PBS -d .

source /opt/intel/oneapi/setvars.sh 

echo
echo start: $(date "+%y/%m/%d %H:%M:%S.%3N")
echo

make run

echo
echo end: $(date "+%y/%m/%d %H:%M:%S.%3N")
echo

其实可以看出没有太多指令…主要是source和make all、make run语句

  • 观测输出

cho start: $(date “+%y/%m/%d %H:%M:%S.%3N”)
echo

make run

echo
echo end: $(date “+%y/%m/%d %H:%M:%S.%3N”)
echo


其实可以看出没有太多指令...主要是source和make all、make run语句

- 观测输出

使用指令 `cat run.sh.oXXXX`,则可以在控制台看到输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值