【CUDA】什么是CUDA?什么是CUDA编程?

目录​​​​​​​

什么是CUDA?

什么是CUDA编程?

CUDA特性

1. 统一的编程模型

2. 统一的硬件架构

3. 统一的内存访问模型

4. 统一的开发工具

CUDA 编程的核心概念

CUDA 编程的基本步骤

CUDA 编程的优势

示例代码:向量加法

总结


什么是CUDA?

        CUDA(Compute Unified Device Architecture,统一计算设备架构),是显卡厂商NVIDIA推出的一种并行计算平台和编程模型。

       概念中的重点是“统一”二字:

       “统一”的含义是指该架构将不同类型的计算设备(主要是CPU和GPU)整合到一个统一的编程模型中,开发者可以使用相同的编程语言和工具集,在CPU和GPU上执行计算任务,而无为 CPU 和 GPU 分别编写完全不同的代码(既同时开发 CPU 和 GPU 上的共同程序),这种统一性简化了并行计算的开发流程

  • 传统方式:CPU 和 GPU 编程是完全分离的,GPU 编程通常需要专门的图形 API(如 OpenGL、DirectX)。

  • CUDA 的方式:通过 CUDA,开发者可以用熟悉的编程语言(如 C/C++)直接编写 GPU 程序,无需学习复杂的图形 API。

什么是CUDA编程?

        理解了CUDA就容易知道,CUDA 编程 是指利用 CUDA(Compute Unified Device Architecture)平台,编写能够在 NVIDIA GPU 上运行的并行计算程序。

CUDA特性

  CUDA(Compute Unified Device Architecture,统一计算设备架构),“统一”(Unified)这个词体现了 CUDA 设计的一个重要理念,“统一”在这里有以下几层含义:


1. 统一的编程模型

CUDA 提供了一种统一的编程模型,使得开发者可以用同一种编程语言(如 C/C++、Python 等)和类似的编程逻辑,同时开发 CPU 和 GPU 上的程序。这种统一性简化了并行计算的开发流程,开发者不需要为 CPU 和 GPU 分别编写完全不同的代码。

  • 传统方式:CPU 和 GPU 编程是完全分离的,GPU 编程通常需要专门的图形 API(如 OpenGL、DirectX)。

  • CUDA 的方式:通过 CUDA,开发者可以用熟悉的编程语言(如 C/C++)直接编写 GPU 程序,无需学习复杂的图形 API。


2. 统一的硬件架构

CUDA 的设计使得 NVIDIA GPU 的硬件架构能够统一支持多种计算任务,而不仅仅是图形渲染。GPU 最初是为图形处理设计的,但 CUDA 将其扩展为一种通用的并行计算设备,可以处理科学计算、机器学习、数据分析等多种任务。

  • 传统 GPU:只能用于图形渲染。

  • CUDA GPU:既可以用于图形渲染,也可以用于通用计算(GPGPU,General-Purpose computing on GPU)。


3. 统一的内存访问模型

CUDA 提供了一种统一的内存访问模型,使得 CPU 和 GPU 可以共享数据,简化了数据交换的过程。通过 CUDA 的统一内存(Unified Memory)技术,CPU 和 GPU 可以访问同一块内存空间,而不需要开发者手动管理数据在 CPU 和 GPU 之间的传输。

  • 传统方式:CPU 和 GPU 有各自独立的内存空间,数据需要在两者之间显式拷贝。

  • CUDA 的方式:通过统一内存,CPU 和 GPU 可以透明地访问同一块内存,减少了编程复杂性。


4. 统一的开发工具

CUDA 提供了一套统一的开发工具(如 CUDA Toolkit),包括编译器、调试器、性能分析工具等,这些工具为开发者提供了完整的支持,使得从开发到优化的整个流程更加高效和一致。

CUDA 编程的核心概念

  1. GPU 与 CPU 的区别

    • CPU:适合处理复杂的串行任务,核心数量较少(通常为 4-16 个),但每个核心的性能较强。

    • GPU:适合处理大规模的并行任务,核心数量非常多(通常为数千个),但每个核心的性能较弱。

    CUDA 编程的核心思想是将适合并行处理的任务(如图像处理、矩阵运算、机器学习等)交给 GPU 执行,从而大幅提升计算速度。

  2. CUDA 编程模型

    • CUDA 扩展了 C/C++ 语言,允许开发者在代码中直接定义 GPU 上运行的函数(称为 核函数,Kernel)。

    • 开发者可以通过 CUDA 控制 GPU 的线程层次结构,将任务分配给成千上万的线程并行执行。

  3. 线程层次结构

    • 线程(Thread):最基本的执行单元。

    • 线程块(Block):一组线程,可以互相协作和共享内存。

    • 网格(Grid):一组线程块,构成一个完整的计算任务。

  4. 内存模型

    • CUDA 提供了多种内存类型,包括全局内存、共享内存、常量内存和寄存器等。开发者需要根据任务特点合理使用这些内存,以优化性能。

CUDA 编程的基本步骤

  1. 1 分配内存

    • 在 GPU 上分配内存,用于存储输入数据和输出结果。

    • 例如:使用 cudaMalloc 分配 GPU 内存。

  2. 2 数据传输

    • 将数据从 CPU 内存拷贝到 GPU 内存。

    • 例如:使用 cudaMemcpy 进行数据传输。

  3. 3 编写核函数

    • 定义在 GPU 上执行的核函数(Kernel),核函数会被多个线程并行执行。

    • 例如:

      __global__ void vectorAdd(float* A, float* B, float* C, int N) {
          int idx = blockIdx.x * blockDim.x + threadIdx.x;
          if (idx < N) {
              C[idx] = A[idx] + B[idx];
          }
      }
  4. 4 启动核函数

    • 调用核函数,并指定线程块和网格的大小。

    • 例如:

      vectorAdd<<<numBlocks, threadsPerBlock>>>(d_A, d_B, d_C, N);
  5. 5 结果回传

    • 将计算结果从 GPU 内存拷贝回 CPU 内存。

    • 例如:使用 cudaMemcpy 将数据从 GPU 拷贝到 CPU。

  6. 6 释放资源

    • 释放 GPU 上分配的内存。

    • 例如:使用 cudaFree 释放内存。


CUDA 编程的优势

  1. 高性能计算

    • GPU 的并行计算能力远超 CPU,适合处理大规模数据并行任务。

    • 例如:深度学习训练、科学计算、图像处理等。

  2. 灵活性

    • CUDA 支持 C/C++、Python 等多种编程语言,开发者可以使用熟悉的工具进行开发。

  3. 广泛的应用领域

    • 深度学习、计算机视觉、物理模拟、金融分析、医学成像等领域都广泛使用 CUDA 加速计算。


示例代码:向量加法

以下是一个简单的 CUDA 程序,实现两个向量的加法:

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

// 核函数:向量加法
__global__ void vectorAdd(float* A, float* B, float* C, int N) {
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    if (idx < N) {
        C[idx] = A[idx] + B[idx];
    }
}

int main() {
    int N = 1024; // 向量大小
    size_t size = N * sizeof(float);

    // 分配主机内存
    float* h_A = (float*)malloc(size);
    float* h_B = (float*)malloc(size);
    float* h_C = (float*)malloc(size);

    // 初始化数据
    for (int i = 0; i < N; i++) {
        h_A[i] = i;
        h_B[i] = i * 2;
    }

    // 分配设备内存
    float *d_A, *d_B, *d_C;
    cudaMalloc(&d_A, size);
    cudaMalloc(&d_B, size);
    cudaMalloc(&d_C, size);

    // 将数据拷贝到设备
    cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);
    cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);

    // 启动核函数
    int threadsPerBlock = 256;
    int blocksPerGrid = (N + threadsPerBlock - 1) / threadsPerBlock;
    vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, N);

    // 将结果拷贝回主机
    cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost);

    // 输出结果
    for (int i = 0; i < 10; i++) {
        std::cout << h_C[i] << " ";
    }
    std::cout << std::endl;

    // 释放内存
    cudaFree(d_A);
    cudaFree(d_B);
    cudaFree(d_C);
    free(h_A);
    free(h_B);
    free(h_C);

    return 0;
}

总结

CUDA 编程是一种利用 NVIDIA GPU 进行并行计算的技术,通过编写核函数并合理管理内存和线程,可以显著加速计算密集型任务。它在深度学习、科学计算、图形处理等领域有广泛应用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《云原生监控体系构建实录:从Prometheus到Grafana的观测革命》

PrometheusGrafana部署配置 Prometheus安装 下载Prometheus服务端 Download | PrometheusAn open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.https://prometheus.io/…

LLM大模型-李宏毅

本博客是对b站上&#xff0c;李宏毅大模型课程的简单记录。 大模型入门到进阶&#xff0c;一套全解决&#xff01; 第1讲&#xff1a;生成式AI是什么&#xff1f; ChatGPT【Chat Generative Pre-trained Transformer】每一步都是文字接龙&#xff0c;其实就是分类问题 文字接…

Codeforces Round 976 (Div. 2) (部分题解)

先做一个提前的小结&#xff0c;感觉这场每题有很特别的结论或者很难去guess的点&#xff0c;但就是能对&#xff0c;可能在证明上有点复杂吧。 A. Find Minimum Operations 思路&#xff1a;题意的话就是用来代替的最小操作步骤&#xff0c; 这里其实可以转换成求将改写成进…

DMR协议空中接口部分

文章目录 前言DMR 空中接口协议栈模型无线空中接口发送与接收参考模型DMR的TDMA结构帧结构突发结构数据与控制突发语音突发公共广播信道突发 数据信息传送时序语音信息传送时序帧同步 调制解调4-CPFSK正交调制4-CPFSK解调基带成型滤波 信道编码类型参考 前言 DMR 协议的标准号主…

专题二串联所有单词的子串

1.题目 题目分析&#xff1a; 有一个字符串s和字符串数组&#xff0c;如何字符串数组里面的元素可以组成一个字符串&#xff0c;然后要在字符串里面找到连续子串跟组成的字符串一样&#xff0c;返回起始地址。 2.算法原理 这道题可以把字符串数组的元素string看出char&#x…

uniapp或者vue 使用serialport

参考https://blog.csdn.net/ykee126/article/details/90440499 版本是第一位&#xff1a;否则容易编译失败 node 版本 18.14.0 npm 版本 9.3.1 electron 版本 30.0.8 electron-rebuild 版本 3.2.9 serialport 版本 10.0.0 需要python环境 main.js // Modules to control app…

编程题-计算器(中等)

题目&#xff1a; 给定一个包含正整数、加()、减(-)、乘(*)、除(/)的算数表达式(括号除外)&#xff0c;计算其结果。 表达式仅包含非负整数&#xff0c;&#xff0c; - &#xff0c;*&#xff0c;/ 四种运算符和空格 。 整数除法仅保留整数部分。 解法一&#xff08;栈&…

数据增强术:如何利用大模型(LLMs)来模拟不同的扰动类型以增强信息提取任务的鲁棒性

一、对抗样本库构建 1. 基于LLMs的领域针对性扰动设计对抗样本生成 替换实体、三元组和触发器&#xff08;Replace Entity, Triple, and Trigger&#xff09; 使用LLMs&#xff08;如GPT-4&#xff09;来替换句子中的实体、关系三元组或事件触发器&#xff0c;同时保持其类型不…

深入了解Linux —— git三板斧

版本控制器git 为了我们方便管理不同版本的文件&#xff0c;就有了版本控制器&#xff1b; 所谓的版本控制器&#xff0c;就是能够了解到一个文件的历史记录&#xff08;修改记录&#xff09;&#xff1b;简单来说就是记录每一次的改动和版本迭代的一个管理系统&#xff0c;同…

Windows编程----进程的当前目录

进程的当前目录 Windows Api中有大量的函数在调用的时候&#xff0c;需要传递路径。比如创建文件&#xff0c;创建目录&#xff0c;删除目录&#xff0c;删除文件等等。拿创建文件的CreateFile函数做比喻&#xff0c;如果我们要创建的文件路径不是全路径&#xff0c;那么wind…

MyBatis-Plus分页控件使用及使用过程发现的一个坑

最近维护一个旧项目的时候&#xff0c;出现了一个BUG&#xff0c;经排查后发现是Mybatis-plus分页控件使用的时候需要注意的一个问题&#xff0c;故在本地使用MybatisPlus模拟出现了一下这个问题。 首先&#xff0c;先说一下MyBatis-Plus的使用&#xff1a; 1&#xff09;引入…

服务端和客户端通信(TCP)

服务端 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks;namespace TeachTcpServer {class Program{static void Main(string[] args){#region 知识点一 …

Windows下配置Flutter移动开发环境以及AndroidStudio安装和模拟机配置

截止 2025/3/9 &#xff0c;版本更新到了 3.29.1 &#xff0c;但是为了防止出现一些奇怪的bug&#xff0c;我安装的还是老一点的&#xff0c;3.19&#xff0c;其他版本的安装同理。AndroidStudio用的是 2024/3/1 版本。 — 1 环境变量&#xff08;Windows&#xff09; PUB_H…

C++11中的Condition_variable

C11中的condition_variable 在C11中&#xff0c;条件变量&#xff08;std::condition_variable&#xff09;是线程同步机制之一&#xff0c;用于在多线程环境中实现线程间的通信和协调。它允许一个或多个线程在某个条件尚未满足时等待&#xff0c;直到其他线程通知条件已经满足…

ROS2-话题学习

强烈推荐教程&#xff1a; 《ROS 2机器人开发从入门到实践》3.2.2订阅小说并合成语音_哔哩哔哩_bilibili 构建功能包 # create package demo_python_pkg ros2 pkg create --build-type ament_python --license Apache-2.0 demo_python_pkg 自己写的代码放在./demo_python_pkg/…

深度学习模型Transformer核心组件—前馈网络FFN

第一章&#xff1a;人工智能之不同数据类型及其特点梳理 第二章&#xff1a;自然语言处理(NLP)&#xff1a;文本向量化从文字到数字的原理 第三章&#xff1a;循环神经网络RNN&#xff1a;理解 RNN的工作机制与应用场景(附代码) 第四章&#xff1a;循环神经网络RNN、LSTM以及GR…

Helm安装chart包到k8s报错“不能重复使用名称,名称已被使用”

一、报错提示如下 “Error: INSTALLATION FAILED: cannot re-use a name that is still in use”,意思是安装chart时提供的名称已存在&#xff0c;不能重复使用同一个名称。 登录后复制 rootiZ:/usr/local/src/my-helm-repo/charts# helm install mymemcached3 memcached -n te…

容器编排革命:从 Docker Run 到 Docker Compose 的进化之路20250309

容器编排革命&#xff1a;从 Docker Run 到 Docker Compose 的进化之路 一、容器化部署的范式转变 在 Docker 生态系统的演进中&#xff0c;容器编排正从“手动操作”走向“自动化管理”。根据 Docker 官方 2023 年开发者调查报告&#xff0c;78% 的开发者已采用 Docker Compo…

对开源VLA sota π0的微调——如何基于各种开源数据集、以及你自己的私有数据集微调π0(含我司的微调实践)

前言 25年2.4日&#xff0c;几个月前推出π0的公司Physical Intelligence (π)宣布正式开源π0及π0-FAST&#xff0c;如之前所介绍的&#xff0c;他们对用超过 10,000 小时的机器人数据进行了预训练 该GitHub代码仓库「 π0及π0-FAST的GitHub地址&#xff1a;github.com/Ph…

VBA使用fso对象合并指定路径的txt文件(含子目录)

图(1) 前几天我跟大家分享了在VBA中如何获取指定类型文件的路径的方法&#xff0c;其中最重要的一个思路就是在处理完当前目录的文件后&#xff0c;再调用程序自身来对子目录进行处理&#xff0c;以此来实现对子目录的无限循环&#xff0c;直至所有文件都处理完毕为止。按照此设…