深入理解DPC++与CUDA:实例解析
目录
- 引言
- 准备工作
- Linux环境要求
- 安装Docker和Nvidia容器工具包
- 示例一:基本向量加法
- 示例二:与现有CUDA API的交互
- 使用库函数Kublas
- 调用Kublas的方式比较
- 示例三:使用CUDA内核
- 将Sickle代码改为CUDA代码
- 直接通过中断任务调用CUDA内核
- 练习:类似示例二的中断任务
- 调用SGMV函数
- 从CUDA代码改为Sickle代码
- 结论
- 常见问题解答
引言
大家好,欢迎来到本次DPC++的实践练习。我是Stuart Adams,Codeplay Software的一名资深软件工程师。我将向大家展示我和我的同事们在过去几个月里为DPC++项目做出的一些贡献。在开始之前,我要明确一点,这些练习仅适用于装有NVIDIA GPU的Linux机器,不适用于Windows或Windows子系统。所以,如果你想跟着我一起进行操作,你需要切换到一个安装了Linux环境并且装有NVIDIA GPU的机器上。另外,你需要熟悉C++编程语言,才能顺利进行本教程的学习。
准备工作
在开始之前,你需要先访问Codeplay Software的GitHub页面,并查看Sickle for CUDA示例代码的存储库。在那里,你可以找到我们将要运行的代码示例和练习,以及运行这些示例和练习所需的说明。
为了顺利进行示例的学习,我们建议你安装Docker和Nvidia容器工具包。这将帮助你运行具有所需库和环境变量的容器,使得使用DPC++更加容易。如果你之前没有安装过Docker和工具包,我们在这里提供了一个安装指南的链接,按照指南完成安装只需要大约五分钟的时间,非常方便。
安装好Docker和Nvidia容器工具包之后,我们就可以开始了。现在,我们只需要运行下面的命令来创建一个新的容器,然后我们就可以在容器中运行示例了。
docker run ...
好了,现在我们进入容器内部,需要先找到存储库所在的目录。它位于home /examples/sickle-for-cuda-examples
。
cd home/examples/sickle-for-cuda-examples
现在我们进入到这个目录下,接下来我们将运行所有的示例代码,然后再看一下练习内容。
示例一:基本向量加法
示例一提供了一个使用Sickle和CUDA编写的基本向量加法实现。通过查看这个示例,你可以很好地了解两种API之间的不同之处。
为了构建示例,我们首先创建一个新的构建目录,然后运行CMake。我建议你复制下面的命令,因为我们需要指定Sickle的根路径,这是指明你的Sickle实现所在位置的好方法。这样做会方便我们在阅读说明文档时进行构建。
mkdir build
cd build
cmake ..
现在CMake已经运行完毕,接下来我们运行make命令,您将看到我们构建了两个应用程序,一个是CUDA版本的,一个是Sickle版本的。
make
好了,现在我们已经有了基本的框架,接下来我们可以看一些更有意思的内容。
示例二:与现有CUDA API的交互
示例二展示了如何在Sickle应用程序中与现有的CUDA API进行交互。所涉及的API是Kublas,这是一个基于CUDA的线性代数库。
这里的示例代码调用了SGM API,它执行矩阵乘法运算。我们有两个程序,你可以通过对比它们来了解从CUDA和Sickle中调用Kublas的不同方式。
让我们构建这个示例。首先,我们创建一个新的构建目录,并运行与之前相同的CMake命令。
mkdir build
cd build
cmake ..
现在我们运行make命令,就可以得到两个可运行的应用程序了。
make
太好了,例子三也非常有趣,因为我们要再次看向量加法的例子,但这次有点不同。我们不再使用Sickle内核,而是改用CUDA内核。所以代码仍然是Sickle的,使用Sickle API进行初始化,但是我们改为使用CUDA内核调用。
要构建这个示例只需运行make命令即可。原因是,当前的CMake版本还没有提供更改CUDA编译器的方法。
make
现在,我们应该有两个可运行的应用程序,一个是向量加法的Sickle版本,另一个是CUDA版本。
好了,希望通过查看这些示例,你对我们引入的新的中断特性有了更清晰的了解。接下来,让我们看一下练习内容。
练习:类似示例二的中断任务
练习一中,我们鼓励你编写一个与示例二非常相似的中断任务。不同的是,练习一要求你调用SGMV
函数,而不是SGM
函数。
我们提供了一个CUDA应用程序,它实现了完全相同的功能。现在,我们需要对这段CUDA代码进行改进,将其适应为Sickle代码。
所以,你需要先查看示例二的代码,熟悉它,然后看一下在Sickle版本中做了哪些改变。然后,只需按照相同的逻辑进行改进,将SGM
函数调用改为SGMV
函数调用。
现在,三个示例都能顺利运行了,你应该对DPC++编程以及在Sickle和CUDA项目之间进行中断处理有了更清晰的理解。
如果你有任何问题,我们将在DevMash Discord服务器上提供支持,讨论练习和我们在DPC++上的工作。这次练习的操作步骤已经录制下来,我们会在YouTube上发布视频的链接,这样你就可以自己回放,以自己的节奏进行学习。
非常感谢大家观看,希望你对DPC++有了更深入的了解。
常见问题解答
问题:这些示例是否适用于Windows系统?
回答:不,这些示例只适用于安装了NVIDIA GPU的Linux系统。
问题:有没有快速安装Docker和Nvidia容器工具包的指南?
回答:是的,你可以在这里找到一个链接,里面有一个快速安装的指南,只需要大约五分钟的时间就可以完成安装。
问题:示例二和练习一中的API有什么差异?
回答:示例二调用了SGM函数,而练习一要求你调用SGMV函数。这两个函数在功能上略有不同。
问题:示例三为什么使用make而不是cmake命令?
回答:因为当前的CMake版本还不支持改变CUDA编译器,所以我们使用make命令代替。
问题:我在哪里可以找到这些示例的代码?
回答:你可以在Codeplay Software的GitHub页面找到Sickle for CUDA示例代码的存储库。
结论
通过本教程的学习和练习,你现在应该对DPC++编程和在Sickle和CUDA项目之间进行中断处理有了更深入的理解。如果你还有其他问题,欢迎来到DevMash Discord服务器与我们讨论。我们还会在YouTube上发布操作步骤的视频链接,方便你回放学习。感谢观看,希望你能更好地掌握DPC++编程。