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

相关文章

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Spring 中的切面与事务结合使用完整示例

《Spring中的切面与事务结合使用完整示例》本文给大家介绍Spring中的切面与事务结合使用完整示例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录 一、前置知识:Spring AOP 与 事务的关系 事务本质上就是一个“切面”二、核心组件三、完

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP