CUDA以及NVCC编译流程

2024-06-20 05:58
文章标签 编译 流程 cuda nvcc

本文主要是介绍CUDA以及NVCC编译流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章转载自:
http://chenrudan.github.io/

在安装CUDA的时候,会安装三个大的组件[1],分别是NVIDIA驱动、toolkit和samples。驱动用来控制gpu硬件,toolkit里面包括nvcc编译器、Nsight调试工具(支持Eclipse和VS,linux用cuda-gdb)、分析和调试工具和函数库。samples或者说SDK,里面包括很多样例程序包括查询设备、带宽测试等等。

1. Runtime API vs Driver API

在写cuda程序时,除了自己写的kernel函数,常常会调用cuda接口函数,最常见的就是全局内存分配函数cudaMalloc(),这里分配的内存暂且理解为gpu硬件参数上的显存。然而在某种情况下可能会看到另外一个函数cuMemAlloc(),这两个函数本质上完成的功能是一样的,都是在分配全局内存,但却属于两套接口,分别为Runtime API和Driver API。下图是cuda软件层的一些组件,实际上在cuda的软件层面,Runtime比Driver API更高级,封装的更好,在Runtime之上就是封装的更好的cuFFT等库。这两个库的函数都是能直接调用的,但Driver API相对于Runtime对底层硬件驱动的控制会更直接更方便,比如对context的控制[2],Driver API调用硬件速度实际上比Runtime也快不了多少。不过Driver API向后兼容支持老版本的,这点Runtime就做不到,7.0的版本代码可能在6.5上就跑不了。大部分的功能两组API都有对应的实现,一般基于Driver API的开头会是cu,而基于Runtime API的开头是cuda,但基于Driver API来写程序会比Runtime API要复杂,虽然功能上差别不大,但是使用Runtime API和更高级的库函数就已经足够了。

2. 常用函数库
NVIDIA针对cuda的使用开发了很多好用的库,包括实现c++ STL的thrust、实现gpu版本blas的cublas、实现快速傅里叶变换的cuFFT、实现稀疏矩阵运算操作的cuSparse以及实现深度学习网络加速的cuDNN等等。在操作这些库时有一个通用的规范,即调用者进行设备内存的分配与释放,内存分配好后将指针传递给这些库接口,就可以进行计算了。

关于thrust,它最基本的数据类型是两个向量容器,host_vetcor和device_vector,分别对应了内存分配在cpu内存和cpu内存,并且提供了非常多的函数模板,例如归约、归并、排序、二分查找等等。此外支持很多STL容器,例如下面的例子(代码来源[4])中即可以从c++容器中将数据复制给thrust的vector,也能将thrust的数据复制给c++ stl。

std::list<int> stl_list;
stl_list.push_back(10);
stl_list.push_back(20);
stl_list.push_back(30);
stl_list.push_back(40);// 从c++ stl的list来初始化device_vector 
thrust::device_vector<

这篇关于CUDA以及NVCC编译流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

使用JavaConfig配置Spring的流程步骤

《使用JavaConfig配置Spring的流程步骤》JavaConfig是Spring框架提供的一种基于Java的配置方式,它通过使用@Configuration注解标记的类来替代传统的XML配置文... 目录一、什么是 JavaConfig?1. 核心注解2. 与 XML 配置的对比二、JavaConf

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Java对接Dify API接口的完整流程

《Java对接DifyAPI接口的完整流程》Dify是一款AI应用开发平台,提供多种自然语言处理能力,通过调用Dify开放API,开发者可以快速集成智能对话、文本生成等功能到自己的Java应用中,本... 目录Java对接Dify API接口完整指南一、Dify API简介二、准备工作三、基础对接实现1.

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Spring AI ectorStore的使用流程

《SpringAIectorStore的使用流程》SpringAI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中发挥着至关重要的作用,本文给大家介... 目录一、VectorStore的基本概念二、VectorStore的核心接口三、VectorStore的

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹