英特尔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

相关文章

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker