【CUDA学习笔记】第三篇:CUDA C并行化编程【下半部分】(附案例代码下载方式)(一)

简介: 【CUDA学习笔记】第三篇:CUDA C并行化编程【下半部分】(附案例代码下载方式)(一)

1、CUDA并行编程的内容概要


   在上一篇推文中,介绍和讨论了cuda内核相关的内容,以及内存分配的相关内容,小编笔耕不停,工作之余继续为大家呈上下半部部分的学习笔记。


本部分将讨论以下主题(紫色部分为本次推文的内容):

   1、内核调用的概念

   2、在CUDA中创建内核函数并向其传递参数

   3、配置CUDA程序的内核参数和内存分配

   4、CUDA程序中的线程执行

   5、在CUDA程序访问GPU设备属性

   6、在CUDA程序中处理向量

   7、并行通信模型


2、在CUDA程序中获取GPU设备属性


  CUDA提供了一个简单的接口来获取一些信息,比如确定支持CUDA的GPU设备(如果有的话),以及每个设备支持什么功能。

   首先,确定计算系统上有多少支持CUDA的设备,这个事情很重要,因为系统可能包含多个支持GPU的设备。这个数量可以由CUDA API cudaGetDeviceCount()来获得。在系统上获得多个支持CUDA设备的程序如下:


   话不多说,直接上代码:

#include <memory>
#include <iostream>
#include <cuda_runtime.h>
#include <stdio.h>
int main(void)
{
int device_Count = 0;
cudaGetDeviceCount(&device_Count);
//cudaGetDeviceCount函数的作用是:如果有一个CUDA设备则返回1,没有的话则返回0
if (device_Count == 0)
{
printf("There are no available device(s) that support CUDA\n");
}
else
{
printf("Detected %d CUDA Capable device(s)\n", device_Count);
}
}


   可以通过查询cudaDeviceProp结构体来找到每个设备的相关信息,这个结构体可以返回所有设备属性。如果有多个支持CUDA的设备,那么可以启动for循环遍历所有设备属性。下面的小节包含了设备属性的列表,这些属性被划分为不同的集合和用于从CUDA程序访问它们的小代码片段。这些属性由CUDA 9运行时中的cudaDeviceProp结构体提供。


2.1、通用设备信息

   cudaDeviceProp结构体提供了可以用来识别设备以及确定使用的版本信息的属性。它提供的name属性,可以以字符串的形式返回设备的名称。我们还可以通过查询cudaDriverGetVersion和cudaRuntimeGetVersion属性获得设备使用的CUDA Driver和运行时引擎的版本。如果你有多个设备,并希望使用其中的具有最多流多处理器的那个,则可以通过multiProcessorCount属性来判断。该属性返回设备上的流多处理器个数。你还可以使用clockRate属性获取GPU的时钟速率。它以Khz返回时钟速率。


2.2、内存相关属性

   GPU上的内存为分层结构。它可以分为L1缓存、L2缓存、全局内存、纹理内存和共享内存。cudaDeviceProp提供了许多特性来帮助识别设备中可用的内存。memoryClockRate和memoryBusWidth分别提供显存频率和显存位宽。显存的读写速度是非常重要的。它会影响程序的总体速度。totalGlobalMem返回设备可用的全局内存大小。totalConstMem返回设备中可用的总常量显存。sharedMemPerBlock返回的是设备上每个块中的最大可用共享内存大小。使用regsPerBlock可以识别每个块的可用寄存器总数。可以使用I2CacheSize属性识别L2缓存的大小。


2.3、线程相关属性

   正如前面看到的,块和线程可以是多维的。因此,最好知道每个维度中可以并行启动多少线程和块。对于每个多处理器的线程数量和每个块的线程数量也有限制。这个数字可以通过maxThreadsPerMultiProcessor和maxThreadsPerBlock找到。它在内核参数的配置中非常重要。如果每个块中启动的线程数量超过每个块中可能的最大线程数量,则程序可能崩溃。可以通过maxThreadsDim来确定块中各个维度上的最大线程数量。同样,每个维度中每个网格的最大块可以通过maxGridSize来标识。它们都返回一个具有三个值的数组,分别显示x、y和z维度中的最大值。


   cudaDeviceProp结构体还有很多其他的属性。你可以查看CUDA编程指南了解其他属性的详细信息。

相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
相关文章
|
前端开发 JavaScript API
阿里云智能媒体服务IMS(Intelligent Media Services)的视频剪辑Web SDK
【1月更文挑战第15天】【1月更文挑战第72篇】阿里云智能媒体服务IMS(Intelligent Media Services)的视频剪辑Web SDK
384 6
|
11月前
|
SEO
CMS建站系统是什么?如何选择CMS建站系统?
本文对CMS建站系统进行了介绍,包括其类型、核心功能以及建站业务流程,希望帮助读者了解和选择适合自家企业的产品。
727 7
|
JSON 前端开发 API
使用微信JS-SDK调用发票接口的完整开发指南
本文介绍了如何使用微信JS-SDK的`chooseInvoiceTitle`接口来调用微信的发票功能。通过微信发票接口,用户可以选择开具个人或单位发票,并获取相关发票信息,如抬头、税号、公司地址等。在文中,详细描述了JS-SDK的初始化、发票接口的调用方式,并提供了完整的代码示例。文章还介绍了如何处理返回的发票信息,帮助开发者快速集成微信发票功能。
517 2
|
弹性计算
新手必看,阿里云国际购买服务器带宽如何选择
新手必看,阿里云国际购买服务器带宽如何选择
|
机器学习/深度学习 数据采集 人工智能
揭秘AI的魔法:如何用机器学习预测股市走势
在金融领域,股市走势的预测一直是一个复杂而充满挑战的问题。随着人工智能技术的发展,机器学习已经成为解决这一问题的有力工具。本文将介绍如何使用机器学习技术来预测股市走势,包括数据准备、模型选择和结果分析等步骤。我们将通过具体实例和数据分析,展示机器学习在股市预测中的应用,并探讨其优势和局限性。最后,我们将提出一个开放性问题,引导读者进一步思考和探索。
|
存储 并行计算 测试技术
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(二)
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(二)
336 0
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(二)
|
存储 编译器 程序员
【C/C++ 虚函数以及替代方案】C++ 虚函数的使用开销以及替代方案(二)
【C/C++ 虚函数以及替代方案】C++ 虚函数的使用开销以及替代方案
312 0
|
Linux Android开发
增加预编译头加快QT工程编译速度的方法
增加预编译头加快QT工程编译速度的方法
354 0
|
并行计算 计算机视觉 异构计算
【CUDA学习笔记】第三篇:CUDA C并行化编程【下半部分】(附案例代码下载方式)(二)
【CUDA学习笔记】第三篇:CUDA C并行化编程【下半部分】(附案例代码下载方式)(二)
362 0
【CUDA学习笔记】第三篇:CUDA C并行化编程【下半部分】(附案例代码下载方式)(二)
|
存储 并行计算 程序员
【CUDA学习笔记】第二篇:CUDA C并行化编程【上半部分】(附案例代码下载方式)
【CUDA学习笔记】第二篇:CUDA C并行化编程【上半部分】(附案例代码下载方式)
650 0