CUDA编程接口详解

news2024/11/18 23:45:12

CUDA编程接口详解

本文将详细介绍NVIDIA CUDA编程指南第3章(编程接口)中的核心概念,例如NVCC编译器、CUDA运行时、版本管理和兼容性、计算模式、模式切换以及Windows下的Tesla计算集群模式。以下是本文的大纲:
在这里插入图片描述

文章目录

  • CUDA编程接口详解
    • 1. Compilation with NVCC
      • 1.1. NVCC编译器简介
      • 1.2. 常用编译选项
      • 1.3. 示例:编译一个简单的CUDA程序
      • 1.4. 示例:使用Makefile编译CUDA程序
    • 2. CUDA Runtime
      • 2.1. 设备管理API
      • 2.2. 内存管理API
      • 2.3. 执行管理API
    • 3. Versioning and Compatibility
      • 3.1. CUDA版本号
      • 3.2. API兼容性
      • 3.3. ABI兼容性
      • 3.4. 示例:检查CUDA版本
    • 4. Compute Modes
      • 4.1. 计算模式简介
      • 4.2. 示例:设置计算模式
      • 4.3. 示例:查询计算模式
    • 5. Mode Switches
    • 6. Tesla Compute Cluster Mode for Windows

1. Compilation with NVCC

NVCC(NVIDIA CUDA Compiler,NVIDIA CUDA编译器)是用于编译CUDA C/C++代码的编译器。要使用NVCC编译CUDA代码,我们需要将CUDA源文件的扩展名设置为.cu,并使用以下命令进行编译:

nvcc -o my_program my_program.cu

在本节中,我们将详细介绍NVCC编译器的用法和选项。以下是本节的内容概述:

  • NVCC编译器简介
  • 常用编译选项
  • 示例:编译一个简单的CUDA程序
  • 示例:使用Makefile编译CUDA程序

1.1. NVCC编译器简介

NVCC是CUDA平台的核心组件之一,它将CUDA C/C++代码转换为GPU可执行的二进制代码。NVCC的运行过程分为两个阶段:首先,它将CUDA代码中的设备代码(device code)和主机代码(host code)分离;然后,它将设备代码交给PTX编译器(NVIDIA的GPU汇编编译器)进行编译,将主机代码交给C/C++编译器(例如GCC或者Clang)进行编译。

1.2. 常用编译选项

NVCC支持许多编译选项,例如:

  • -arch=sm_XX:设置目标架构,例如-arch=sm_35用于编译支持计算能力3.5的程序;
  • -c:仅编译,不进行链接;
  • -o:设置输出文件名;
  • -I:设置头文件搜索路径;
  • -L:设置库文件搜索路径;
  • -l:链接库文件。

1.3. 示例:编译一个简单的CUDA程序

假设我们有一个简单的CUDA程序vector_add.cu,其内容如下:

#include <iostream>
#include <cuda_runtime.h>

__global__ void vector_add(const float *A, const float *B, float *C, int N) {
    int i = blockDim.x * blockIdx.x + threadIdx.x;
    if (i < N) {
        C[i] = A[i] + B[i];
    }
}

int main() {
    // ...省略主机代码...
}

要使用NVCC编译这个程序,我们可以执行以下命令:

nvcc -o vector_add vector_add.cu

编译成功后,我们可以运行生成的可执行文件vector_add

1.4. 示例:使用Makefile编译CUDA程序

在实际项目中,我们通常需要编译多个源文件,并链接多个库文件。为了简化编译过程,我们可以使用Makefile来管理编译选项和依赖关系。以下是一个简单的Makefile示例:

# 设置NVCC编译器和编译选项
NVCC = nvcc
CFLAGS = -arch=sm_35 -I/usr/local/cuda/include

# 设置目标文件和源文件
TARGET = vector_add
SOURCES = vector_add.cu

# 编译规则
all: $(TARGET)

$(TARGET): $(SOURCES)
	$(NVCC) $(CFLAGS) -o $@ $^

clean:
	rm -f $(TARGET)

使用这个Makefile,我们可以直接运行make命令来编译CUDA程序。

2. CUDA Runtime

CUDA运行时(CUDA Runtime)是一个用于管理设备、内存和执行的高级API。它包括以下几个部分:

  • 设备管理:包括设备查询、设备选择、设备属性获取等功能;
  • 内存管理:包括设备内存分配、释放、数据传输等功能;
  • 执行管理:包括核函数调用、同步、流管理等功能。

在本节中,我们将详细介绍CUDA运行时API的使用方法和注意事项。以下是本节的内容概述:

  • 设备管理API
  • 内存管理API
  • 执行管理API

2.1. 设备管理API

设备管理API主要用于查询和设置CUDA设备。以下是一些常用的设备管理API:

  • cudaGetDeviceCount(int *count):获取可用CUDA设备的数量;
  • cudaGetDeviceProperties(cudaDeviceProp *prop, int device):获取指定设备的属性;
  • cudaSetDevice(int device):选择当前线程使用的设备;
  • cudaGetDevice(int *device):获取当前线程使用的设备。

2.2. 内存管理API

内存管理API主要用于分配、释放和传输设备内存。以下是一些常用的内存管理API:

  • cudaMalloc(void **devPtr, size_t size):分配设备内存;
  • cudaFree(void *devPtr):释放设备内存;
  • cudaMemcpy(void *dst, const void *src, size_t count, cudaMemcpyKind kind):传输内存数据。

2.3. 执行管理API

执行管理API主要用于调用核函数、同步和管理流。以下是一些常用的执行管理API:

  • __global__:定义核函数;
  • <<<...>>>():调用核函数;
  • cudaStreamCreate(cudaStream_t *pStream):创建流;
  • cudaStreamDestroy(cudaStream_t stream):销毁流;
  • cudaStreamSynchronize(cudaStream_t stream):同步流;
  • cudaDeviceSynchronize():同步设备。

3. Versioning and Compatibility

CUDA使用版本号表示其API和ABI(Application Binary Interface,应用程序二进制接口)的兼容性。CUDA的版本号由三部分组成:主版本号、次版本号和修订版本号,例如CUDA 10.2.89。

主版本号和次版本号用于表示API的兼容性。如果应用程序使用的CUDA版本与系统安装的CUDA版本在主版本号和次版本号上一致,则应用程序可以正常运行。修订版本号用于表示ABI的兼容性。如果应用程序使用的CUDA版本与系统安装的CUDA版本在修订版本号上一致或更低,则应用程序可以正常运行。

在本节中,我们将详细介绍CUDA版本管理和兼容性的概念和实践。以下是本节的内容概述:

  • CUDA版本号
  • API兼容性
  • ABI兼容性
  • 示例:检查CUDA版本

3.1. CUDA版本号

CUDA版本号由三部分组成:

  • 主版本号(Major version):表示CUDA平台的主要功能和架构变化;
  • 次版本号(Minor version):表示CUDA平台的次要功能和性能改进;
  • 修订版本号(Revision version):表示CUDA平台的细节修复和优化。

例如,CUDA 10.2.89表示主版本号为10,次版本号为2,修订版本号为89。

3.2. API兼容性

API兼容性是指一个CUDA程序可以在不同版本的CUDA平台上正常运行。API兼容性主要由主版本号和次版本号决定:

  • 如果一个CUDA程序使用的CUDA版本与系统安装的CUDA版本在主版本号和次版本号上一致,则该程序可以正常运行;
  • 如果一个CUDA程序使用的CUDA版本的主版本号高于系统安装的CUDA版本的主版本号,则该程序可能无法正常运行;
  • 如果一个CUDA程序使用的CUDA版本的主版本号低于系统安装的CUDA版本的主版本号,但次版本号高于或等于系统安装的CUDA版本的次版本号,则该程序可以正常运行;
  • 如果一个CUDA程序使用的CUDA版本的主版本号低于系统安装的CUDA版本的主版本号,且次版本号低于系统安装的CUDA版本的次版本号,则该程序可能无法正常运行。

3.3. ABI兼容性

ABI兼容性是指一个CUDA程序的二进制文件可以在不同版本的CUDA平台上正常运行。ABI兼容性主要由修订版本号决定:

  • 如果一个CUDA程序使用的CUDA版本与系统安装的CUDA版本在修订版本号上一致或更低,则该程序可以正常运行;
  • 如果一个CUDA程序使用的CUDA版本的修订版本号高于系统安装的CUDA版本的修订版本号,则该程序可能无法正常运行。

3.4. 示例:检查CUDA版本

要检查CUDA版本,我们可以使用以下方法:

  • 查看CUDA运行时库的版本:cat /usr/local/cuda/version.txt
  • 查看CUDA编译器的版本:nvcc --version
  • 查看CUDA驱动的版本:nvidia-smi
  • 在CUDA程序中获取版本信息:
#include <iostream>
#include <cuda_runtime.h>

int main() {
    int runtime_version = 0;
    int driver_version = 0;
    cudaRuntimeGetVersion(&runtime_version);
    cudaDriverGetVersion(&driver_version);
    std::cout << "CUDA Runtime Version: " << runtime_version << std::endl;
    std::cout << "CUDA Driver Version: " << driver_version << std::endl;
    return 0;
}

4. Compute Modes

CUDA支持多种计算模式,用于控制设备的访问权限。计算模式分为以下几种:

  • Default(默认):设备可以被多个线程和多个上下文(Context)同时访问;
  • Exclusive Process(独占进程):设备只能被一个进程访问,但可以被多个线程和多个上下文同时访问;
  • Prohibited(禁止):设备不能被任何线程或上下文访问。

在本节中,我们将详细介绍CUDA计算模式的概念和实践。以下是本节的内容概述:

  • 计算模式简介
  • 示例:设置计算模式
  • 示例:查询计算模式

4.1. 计算模式简介

计算模式是一种用于控制CUDA设备访问权限的机制。通过设置计算模式,我们可以控制设备在多个线程和多个上下文之间的共享行为。以下是计算模式的详细介绍:

  • Default(默认):设备可以被多个线程和多个上下文同时访问。这种模式适用于大多数情况,因为它允许多个CUDA程序并行运行;
  • Exclusive Process(独占进程):设备只能被一个进程访问,但可以被多个线程和多个上下文同时访问。这种模式适用于需要独占设备资源的高性能计算场景;
  • Prohibited(禁止):设备不能被任何线程或上下文访问。这种模式适用于需要禁用CUDA设备的安全或节能场景。

4.2. 示例:设置计算模式

要设置计算模式,我们可以使用以下方法:

  • 在CUDA程序中设置计算模式:
#include <iostream>
#include <cuda_runtime.h>

int main() {
    int device = 0;
    cudaSetDevice(device);

    // 设置计算模式为独占进程
    cudaError_t err = cudaDeviceSetSharedMemConfig(cudaComputeModeExclusiveProcess);
    if (err != cudaSuccess) {
        std::cerr << "Failed to set compute mode: " << cudaGetErrorString(err) << std::endl;
        return 1;
    }

    // ...执行其他CUDA操作...

    return 0;
}
  • 使用nvidia-smi命令行工具设置计算模式:
# 设置设备0的计算模式为独占进程
nvidia-smi -i 0 -c EXCLUSIVE_PROCESS

4.3. 示例:查询计算模式

要查询计算模式,我们可以使用以下方法:

  • 在CUDA程序中查询计算模式:
#include <iostream>
#include <cuda_runtime.h>

int main() {
    int device = 0;
    cudaSetDevice(device);

    // 获取计算模式
    cudaComputeMode compute_mode;
    cudaDeviceProp device_prop;
    cudaGetDeviceProperties(&device_prop, device);
    compute_mode = device_prop.computeMode;

    // 打印计算模式
    switch (compute_mode) {
        case cudaComputeModeDefault:
            std::cout << "Compute mode: Default" << std::endl;
            break;
        case cudaComputeModeExclusiveProcess:
            std::cout << "Compute mode: Exclusive Process" << std::endl;
            break;
        case cudaComputeModeProhibited:
            std::cout << "Compute mode: Prohibited" << std::endl;
            break;
        default:
            std::cerr << "Unknown compute mode" << std::endl;
            return 1;
    }

    return 0;
}
  • 使用nvidia-smi命令行工具查询计算模式:
# 查询设备0的计算模式
nvidia-smi -i 0 --query-gpu=compute_mode --format=csv

5. Mode Switches

CUDA的模式切换功能允许用户在系统运行时切换计算模式。模式切换通过nvidia-smi命令行工具实现,用户可以根据需要随时切换计算模式。

以下是一个模式切换的示例:

  1. 查看当前计算模式:
nvidia-smi -i 0 --query-gpu=compute_mode --format=csv
  1. 将计算模式切换为独占进程:
nvidia-smi -i 0 -c EXCLUSIVE_PROCESS
  1. 验证计算模式已更改:
nvidia-smi -i 0 --query-gpu=compute_mode --format=csv

需要注意的是,模式切换可能会影响正在运行的CUDA程序。在切换计算模式之前,请确保所有相关程序已关闭。

6. Tesla Compute Cluster Mode for Windows

Tesla计算集群模式(Tesla Compute Cluster Mode,简称TCC模式)是NVIDIA为Windows平台提供的一种高性能计算模式。TCC模式旨在提高Tesla GPU在高性能计算场景中的性能和稳定性,包括以下特性:

  • 优化的内存传输性能;
  • 支持大内存分页;
  • 支持Peer-to-Peer内存传输;
  • 更低的内核启动延迟;
  • 系统管理中断(SMI)隔离。

要启用TCC模式,用户需要使用NVIDIA控制面板或nvidia-smi命令行工具。启用TCC模式后,Tesla GPU将作为专用计算设备运行,无法用于图形显示。

需要注意的是,TCC模式仅适用于Windows平台上的Tesla GPU。其他平台和GPU系列不受影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/604172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 11 Dimensionality Reduction

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 11 Dimensionality Reduction Let M be a square matrix. Let λ be a constant and e a nonzero column vector with the same number of rows as M. Then λ is an eigenvalue of M and e is t…

快手三面全过了,却因为背调时leader手机号造假,导致offer作废了!

这是一个悲伤的故事&#xff1a; 快手本地三面全过了&#xff0c;但因为背调时leader手机号造假&#xff0c;导致offer作废了。 楼主感叹&#xff1a;大家背调填写信息时&#xff0c;一定要慎重再慎重&#xff0c;不要重复他的悲剧&#xff01; 网友愤慨&#xff0c;照这么说&a…

【Nginx 优化与防盗链】

目录 一、Nginx 服务优化1、配置Nginx 隐藏版本号2、修改用户与组3、缓存时间4、日志切割小知识 二、Nginx 深入优化1、连接超时2、更改进程数3、配置网页压缩4、配置防盗链 一、Nginx 服务优化 1、配置Nginx 隐藏版本号 可以使用 Fiddler 工具抓取数据包&#xff0c;查看 Ng…

UniApp全局弹窗

一、设计思路 1、创建一个弹窗页面组件 2、配置page.json&#xff0c;使页面跳转是在当前界面展示 3、定义uni全局全局属性 4、解决多个弹窗同时使用的冲突问题 注意&#xff1a;此方案不支持多个弹窗并存&#xff0c;有且仅有一个会展示&#xff0c;当前弹窗展示并关闭上一个弹…

连锁药店系统:如何提高效率和客户满意度?

连锁药店系统是一种用于提高效率和客户满意度的软件系统&#xff0c;它能够管理多个药店的日常营运。通过这种系统&#xff0c;药店可以更好地管理库存、员工、销售和客户信息等方面&#xff0c;从而提高整体的经营效率。 首先&#xff0c;连锁药店系统能够帮助药店管理库存。系…

黑马Redis视频教程实战篇(六)

目录 一、附近商户 1.1、GEO数据结构的基本用法 1.2、导入店铺数据到GEO 1.3、实现附近商户功能 二、用户签到 2.1、BitMap功能演示 2.2、实现签到功能 2.3、签到统计 2.4、关于使用bitmap来解决缓存穿透的方案 三、UV统计 3.1、HyperLogLog 3.2、测试百万数据的统…

I.MX6ull 中断 二 (按键驱动蜂鸣器)

按键中断 KEY0 &#xff08;UART1_CTS 引脚&#xff09;触发蜂鸣器 1 修改start.S 添加中断相关定义 中断向量表 .global _start /* 全局标号 *//** 描述&#xff1a; _start函数&#xff0c;首先是中断向量表的创建* 参考文档:ARM Cortex-A(armV7)编程手册V4.0.pdf P…

【花雕学AI】ChatGPT帮我快速优化标题:古老的非洲部落,有一种神奇的超音速烫脚舞

关于非洲烫脚舞&#xff0c;直接看看ChatGPT的许多创意&#xff0c;一般人确实想不到&#xff1a; 部落文化的声动震波 非洲之歌:部落的音速节奏 非洲土著的音速脚掌传奇 古老部落的震人心魂之舞 非洲红土之声:脚掌舞的激情 非洲神秘部落的超音速脚掌舞 仙踪般的部落音乐…

chatgpt赋能python:Python绘制函数曲线:创造出令人惊叹的图形

Python绘制函数曲线&#xff1a;创造出令人惊叹的图形 随着越来越多的人开始关注数据可视化&#xff0c;Python成为了一种被广泛使用的工具&#xff0c;用于创建各种图形&#xff0c;包括函数曲线。Python图形库的灵活性和适用性使得它成为数据科学和工程领域中最受欢迎的编程…

如何用 ChatGPT 一句话生成 Web 应用?

原型系统的开发对很多不会编程的人来说&#xff0c;原本确实是一道门槛&#xff0c;而且看似难以逾越。而现在&#xff0c;障碍突然间就消失了。 插件 ChatGPT 现在有了一个内容比较丰富的插件系统&#xff0c;而且 Plus 用户已经不再需要填表申请后漫长等待&#xff0c;直接就…

英雄算法联盟 | 六月算法集训顺利开始

文章目录 前言一、集训规划二、星友的反馈1、有觉得题目简单重新找回了自信的2、有拿到题不管三七二十一疯狂输出的3、有为了完成当天作业奋斗到凌晨的4、有自己悟出了坚持就是胜利的道理的5、有发现身边人都在跑而跃跃欲试的6、有上班摸鱼刷题只因为了赶进度的7、有看到大家都…

【微信小程序开发】第 2 节 - 注册小程序开发账号

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、注册小程序开发账号 3、总结 1、缘起 开发微信小程序从大的方面来说主要分为三步&#xff1a; ① 注册小程序开发…

【观察】星环科技:布局行业大模型赛道,加速国产化替代进程

以ChatGPT和GPT所代表的大模型&#xff0c;已经在国内形成了“海啸效应”&#xff0c;几乎所有的科技公司都在想方设法进入大模型的赛道。背后的核心驱动力&#xff0c;就在于大模型的最大价值在于普遍提升个人生产力&#xff0c;而各行各业的公司都在积极寻找应用大模型和生成…

黑客使用哪些编程语言

黑客使用哪些编程语言&#xff1f; 使用 Python 分析漏洞利用数据库 克里斯蒂安科赫 迈向数据科学 2021 年&#xff0c;我们与科学家同行一起在德国混沌计算机俱乐部 &#xff08;CCC&#xff09; 进行了一项调查。我们的目标是找出黑客最常使用的编程语言。 本文跟进调查&…

M F C(七)对话框

概念 与用户进行交互的窗口&#xff0c;它的顶级父类为CWND&#xff0c;对话框上面可以有各种控件&#xff0c;控件也是继承自CWND 基本控件功能对应的类静态文本框显示文本&#xff0c;一般不能接收输入信息CStatic图像控件显示图标、方框、和图元文件CStatic编辑器编辑正文…

公网SSH远程连接Termux – 电脑使用安卓Termux 「无需公网IP」

文章目录 1.安装ssh2.安装cpolar内网穿透3.远程ssh连接配置4.公网远程连接5.固定远程连接地址 转载自cpolar极点云的文章&#xff1a;公网SSH远程连接Termux – 电脑使用安卓Termux 「无需公网IP」 使用安卓机跑东西的时候&#xff0c;屏幕太小&#xff0c;有时候操作不习惯。不…

【Linux】crontab 定时任务

当你需要在Linux系统中定期执行某些任务时&#xff0c;crontab&#xff08;cron table&#xff09;是一个非常有用的工具。它允许你根据预定的时间表创建和管理定时任务。 一、从守护进程到crond进程1.1 Linux 守护进程1.2 任务调度进程crond 二、 crontab 详细介绍2.1 crontab…

AI狂飙突进,存力需作先锋

5月30日&#xff0c;在2023中关村论坛成果发布会上&#xff0c;《北京市加快建设具有全球影响力的人工智能创新策源地实施方案&#xff08;2023-2025年&#xff09;》正式发布。《实施方案》要求&#xff0c;支持创新主体重点突破分布式高效深度学习框架、大模型新型基础架构等…

chatgpt赋能python:Python列表数据相加的完全指南

Python列表数据相加的完全指南 Python中的列表是一种非常方便的数据结构&#xff0c;它允许我们存储和处理一组数据。在这篇文章中&#xff0c;我们将介绍如何在Python中使用列表来进行数据相加的操作&#xff0c;并提供一些实用的技巧和建议。如果你正在寻找Python中关于列表…

linux安装docker并设置国内镜像仓库

前置条件 该方案为centos上安装docker&#xff0c;其他版本linux请参照官方文档&#xff1a;https://docs.docker.com/engine/install/centos/该linux系统没有安装过docker&#xff0c;或者已卸载docker #卸载docker yum remove docker \docker-client \docker-client-latest…