英特尔oneAPI—DPCT 移植 CUDA 程序方法、示例及注意事项

2023-12-19 17:59

本文主要是介绍英特尔oneAPI—DPCT 移植 CUDA 程序方法、示例及注意事项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

oneAPI 提供了 DPCT 工具来移植 CUDA 程序,官方称可以移植 95 %的 CUDA 程序。实际体验下来,在自动生成的代码有一些小的语法上错误,需要做一些修正才可正常使用。暂时感觉 AMD 的 hipify 转出来的程序需要修改的内容更少。毕竟 C 语言转 C++ 难度挺大的。可以通过以下途径获取和安装 DPCT:

  • 安装 Intel OneAPI Base Toolkit 。
  • 单独安装 DPCT。

DPCT 的使用方式

移植单个 CUDA 文件

单个文件时,对 CUDA 程序进行迁移十分的简单,只需要输入下面的命令行即可完成迁移:

dpct --in-root=. src/<cuda_source_code>.cu --cuda-include-path=<path>/cuda/include 

其中cuda_source_code 文件为需要转换的 CUDA 程序。--cuda-include-path 后加 CUDA 头文件的路径。

移植 CUDA 工程

在实际的 CUDA 项目开发中,一般都是通过 Makefile 或者 CMake 来管理工程。DPCT 同样也支持直接对上述方式管理的 CUDA 工程进行移植。不用用户一个一个的将 CUDA 程序进行迁移。

Makefile工程

第一步:intercept

使用 DPCT 内置的 intercept-build 指令,可以自动的生成 DPCT 所能支持 compile_commands.json 文件,方便 DPCT 进行转化。

make clean
intercept-build make

在当前文件假下会生成 compile_commands.json 文件。

倘若当前项目已经构建完成了,需要先执行make clean,否则会无法移植。

第二步:使用 DPCT 进行移植

使用DPCT的-p 选项和第一步生成的compile_commands.json 文件来将 CUDA 程序转为 DPC++ 程序。

dpct --in-root=. -p compile_commands.json --cuda-include-path=<path>/cuda/include 

示例

以 cuda 经典入门程序 VectorAdd 为例。

首先使用intercept-build make 来生成compile_commands.json ,再用dpct 生成相对应的 oneAPI 代码。在我的环境下输入如下指令即可:

intercept-build make
dpct --in-root=. -p compile_commands.json --cuda-include-path=/opt/cuda/include 

需要根据自己环境配置路径

CMake工程

先使用 cmake 指令生成相应的 Makefile 文件,其余步骤与上一章节相同。

其他重要的 Options

  • –assume-nd-range-dim=,值为1、3,默认的情况下dpct是将程序转为三维 nd-range,对于一些简单的 CUDA 程序,我们指定为 1,更加方便理解。
  • –optimize-migration,调用后会尽可能优化程序。
  • –out-root,指定输出文件夹的路径。
  • –usm-level,指定是否 usm,oneAPI 中的 usm 相当于 CUDA 的 Unified Memory,若为 Restricted 则使用 usm,若为 none 则不使用。

CUDA 与 oneAPI 对应概念

编程模型

CUDAthreadwrapblockgrid
DPC++(oneAPI)work itemsub groupwork groupnd range
OpenCLwork itemsub groupwork groupnd range

数据管理模型

CUDAsharedUnified Memory_syncthreads
DPC++(oneAPI)localUnified Shared Memorybarrier
OpenCLlocalUnified Shared Memorybarrier

onoAPI 在 CPU 上的映射

在CPU硬件上的映射

注意事项

oneAPI 暂不支持的内容

头文件

所有 CUDA helper头文件,oneAPI 暂时不支持,当然,也可以直接将相应的 helper 代码复制到工程中来,从而使得 DPCT 将其转化为 DPC++代码。

#include <helper_functions.h>
#include <helper_strings.h>
#include <helper_cuda.h>
...

API

因为 CUDA 和 DPC++ 的编程模型和风格的不同,导致了 DPC++ 缺失一部分的 API。但是,总体都有相应的替换方法。

//CUDA
checkCudaError(...);
//cublas
cublasCreate(...);
cublasDestory(...);

此处关于第一个API,有一个很好的移植方法,就是使用try{...} catch(...){exit(-1)} 的方法对要检测的内容进行包裹。

参考资料和扩展阅读

  • Migrate Your Existing CUDA Code to Data Parallel C++ (intel.com)
  • 官方诊断信息以及修改建议

这篇关于英特尔oneAPI—DPCT 移植 CUDA 程序方法、示例及注意事项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/513160

相关文章

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

python获取网页表格的多种方法汇总

《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.