深入浅出 NVIDIA CUDA 架构与并行计算技术

news2025/4/24 3:36:18

🐇明明跟你说过:个人主页

🏅个人专栏:《深度探秘:AI界的007》 🏅

🔖行路有良友,便是天堂🔖

目录

一、引言

1、CUDA为何重要:并行计算的时代

2、NVIDIA在GPU计算领域的角色

二、CUDA简介

1、什么是CUDA

2、CUDA的历史与发展

三、CUDA架构解析

1、GPU vs CPU:架构对比

2、CUDA核心组件

四、CUDA编程模型

1、CUDA程序的基本结构

2、Kernel函数与线程层级

3、内存管理与数据传输(Host ↔ Device)


一、引言

1、CUDA为何重要:并行计算的时代

🧠 单核时代的终结

曾几何时,我们对计算性能的追求是这样的:

“CPU 主频越高越好,单核越强越牛!” 🐎

但摩尔定律渐趋放缓,散热瓶颈越来越明显,频率提升也越来越难……

于是,计算行业悄悄转向了一条新路:并行计算。


 🔀 串行 vs 并行:一次做一件事 vs 同时做很多事

场景串行(CPU)并行(GPU)
洗100个苹果一人洗100个 🍎100个人各洗一个 🍎
图像渲染一像素一像素地算 🐢一次处理上万像素 🚀
视频编解码一帧帧慢慢处理 🎞️多线程同时压缩处理 📽️

🎮 CUDA 的登场:让 GPU 不只是打游戏!

NVIDIA 发现:

“嘿,我们家显卡这么猛,为什么不拿来干点科研的活呢?”

于是他们发布了 CUDA(Compute Unified Device Architecture)

2、NVIDIA在GPU计算领域的角色

💬 “为啥大家一提 GPU 计算就想到 NVIDIA?”

 🏆 NVIDIA 在 GPU 计算领域的角色

💡 从显卡厂商到计算王者的转型

在很多人眼中,NVIDIA 一开始只是“做显卡的公司”:

🎮 给游戏加速
🎬 给影视渲染
🎨 给设计师画图更丝滑

BUT!

NVIDIA 真正的雄心,从来不止于此 —— 它要让 GPU 成为 通用计算平台,改变整个计算产业的未来。


 📊 市场格局:几乎垄断的存在

领域NVIDIA 份额(粗略估计)代表产品
深度学习训练硬件90%+A100、H100、DGX
高性能计算(HPC)80%+Tesla 系列、NVLink
AI 推理 & 云计算加速器快速增长中L40、T4、Grace Hopper


二、CUDA简介

1、什么是CUDA

你有没有想过,电脑里的 显卡(GPU) 除了打游戏、看电影,其实还可以帮我们做科学计算、跑 AI 模型、挖矿(没错,就是你听说过的那个)🤯
这背后,有一项“黑科技”功不可没——CUDA

🧠 简单来说,CUDA 是什么?

CUDA,全称是 Compute Unified Device Architecture,由 NVIDIA 开发。
通俗点说,它是让显卡“听懂”程序员指令的工具,让 GPU 不只是画画图,还能做“正经数学题”。🎨 ➡️ 📐📊

🎮 CPU vs GPU:一场角色扮演大比拼

属性CPU(中央处理器)🧑‍💻GPU(图形处理器)🕹️
核心数量少(通常 4~16)多(上千个)
单核能力强(能干大事)弱(擅长干重复的活)
擅长任务串行处理(一步步来)并行处理(群体作战)
应用场景系统操作、逻辑控制等图形渲染、AI计算等

举个栗子 🌰
想象一下,CPU 是“全能型学霸”,擅长一心一用,解决复杂逻辑题;
而 GPU 是“搬砖小能手”,擅长一口气搬 100 块砖,非常适合干重复又密集的活儿,比如矩阵运算、图像处理、深度学习。


👷 CUDA:让程序员调动显卡的“千军万马”

以前 GPU 只能画画图,程序员很难直接让它干别的活。
CUDA 的出现就像给程序员发了一把钥匙🔑,可以“呼叫”GPU,让它帮忙处理计算任务!

✅ 支持 C/C++/Python 编程语言
✅ 你写的代码可以运行在 GPU 上,而不是 CPU
✅ 支持大规模并行运算,速度飞快!


🎯 举个实际例子

假如你要给 1 亿个数字都加上 1。

  • 用 CPU:你排队慢慢加,每次处理一个(像银行窗口🙃)

  • 用 CUDA + GPU:你开 10,000 个窗口一起加(像春运高速收费站🏁)

速度那叫一个快!


🤖 CUDA 用在哪里?

💡 深度学习模型训练(比如 ChatGPT 的训练就靠它)
🧬 生物医学模拟
🎞️ 视频转码、图像处理
🌍 天气预测、地震模拟、金融风险分析……

 

2、CUDA的历史与发展

🎬 1. 起点:GPU 只是“画面小工”

🔙 时间回到 2000 年前后——那时的 GPU(比如 GeForce2)基本只是负责“画图”的:

  • 把游戏渲染得更炫酷

  • 把视频播放得更顺滑

完全是为显示服务的「图形小助手」🎨,离“通用计算”还差十万八千里。


💡 2. 萌芽:聪明人发现“GPU 运算能力好猛!”

在科研圈,有人开始偷偷用 GPU 来做“非图形计算”。他们发现:

✨“这玩意居然跑矩阵比 CPU 快多了?”

那时的 GPU 没有专门支持“通用计算”的编程接口,只能用很复杂的 OpenGL/DirectX Shader 技巧“曲线救国”,开发难度堪比修仙⚒️


🚀 3. 决定性转折:2006 年 CUDA 横空出世

NVIDIA 看到机会来了,果断出手!

🗓️ 2006 年:CUDA 1.0 正式发布!
它是全球第一个面向 GPU 的通用计算平台,程序员终于可以用 C 语言控制 GPU 干活了🔥

从此,GPU 不再是“图形工具人”,而成为了“并行计算的加速王”。


📈 4. 快速进化:从 Fermi 到 Hopper,一代更比一代猛

CUDA 平台与 NVIDIA GPU 架构是配套演进的:

年份架构代号特点亮点
2008Tesla第一代 GPGPU,支持双精度浮点
2010Fermi引入 L1/L2 缓存,提升通用计算性能
2012Kepler提升能效,支持动态并行
2016Pascal加入 Tensor 核心前奏,HPC 友好
2017Volta初代 Tensor Cores,AI 训练神器
2020Ampere强化 AI 计算,支持多精度并行
2022Hopper全面 AI 化身,专为 Transformer 打造
2024Blackwell最新旗舰,推理性能暴涨

每一代 CUDA Toolkit 也在同步升级,支持更强的编译器、更高级的优化、更丰富的库。


🧠 5. 与 AI 深度绑定:CUDA 成为 AI 的发动机

  • 2012:AlexNet 横空出世,用 NVIDIA GTX 580 训练,AI 炸裂出圈💥

  • 之后:PyTorch、TensorFlow 等深度学习框架,几乎都离不开 CUDA 后端

  • 现在:从 ChatGPT 到 Stable Diffusion,背后 GPU 加速都是靠 CUDA ✊


🧩 6. 今日 CUDA:不仅仅是一个库,更是一整个宇宙

CUDA 不再只是“让 GPU 干活”,它成了一个完整的开发生态:

  • 📦 各种库:cuDNN、cuBLAS、TensorRT、NCCL…

  • 🧰 工具链:Nsight、Visual Profiler、CUDA Graph…

  • 🌍 平台支持:从嵌入式 Jetson 到数据中心 DGX 全都能用

 

CUDA 的成长 = 从一把螺丝刀 🪛 ➡️ 到一整套核武库 💣

它改变了 GPU 的命运,也重新定义了“计算”的方式。
今天,如果你说你搞 AI、做科学计算、研究机器学习,却没听说过 CUDA——那就像学魔法不知道哈利波特🧙‍♂️。


三、CUDA架构解析

1、GPU vs CPU:架构对比

在 CUDA 的世界里,最常听到的问题之一就是:

“既然我有 CPU,为什么还要用 GPU 来计算呢?”

这个问题就像问:

“我有一辆小轿车,为什么还需要火车?”🚗 vs 🚄

它们各有专长!CPU 和 GPU 不是谁更好,而是适合干不同的活


 🏗️ 架构对比:一个是多面手,一个是并行狂魔

特性🧑‍💻 CPU(中央处理器)🕹️ GPU(图形处理器)
核心数量少(4~16个高性能核心)多(数百到上万个)
每个核心的能力强,能处理复杂指令弱,专注简单重复计算
控制单元多,负责调度和决策少,更依赖外部控制
缓存系统大,层次复杂(L1/L2/L3)小而专注
适合的任务类型串行任务、多任务处理数据并行、大规模计算
延迟 vs 吞吐量低延迟、决策快高吞吐、批量处理猛
编程难度简单,工具成熟相对复杂(CUDA等)
举个例子跑操作系统、打开网页训练 AI、视频渲染

🧩 用生活举个例子!

  • CPU 像一位博士👨‍🎓:一个人能力特别强,但只能一心一用,适合解决逻辑复杂、步骤多的问题。

  • GPU 像一群工人👷‍♂️👷‍♀️:单个能力可能不高,但可以分工协作,把重复性的任务快速干完,效率爆表!


 💡 实际场景谁上场?

场景谁更合适
打开浏览器、运行操作系统✅ CPU
视频渲染、图形处理✅ GPU
训练深度神经网络(AI)✅ GPU
数据库查询、事务处理✅ CPU
模拟气候、科学建模、并行计算✅ GPU
编译代码、跑脚本✅ CPU
游戏里的实时光影渲染✅ GPU

🚦 并行模型上的区别

特性CPUGPU
并行粒度粗粒度(每核处理独立任务)细粒度(线程块内高度同步)
指令模型MIMD(多指令多数据)SIMT(单指令多线程)
控制逻辑多样化、复杂简化、统一控制

 📘 名词解释:

  • MIMD:每个核心都可以执行不同的指令

  • SIMT:多个线程执行相同的指令,但处理不同的数据


 🧠 小结一句话!

CPU 负责“聪明的决策”,GPU 擅长“傻快的计算”
它们不是敌人,而是互补搭档,现代计算中通常是搭配使用的!

 

2、CUDA核心组件

🔧 CUDA 核心组件:构建 GPU 编程的四大金刚

你可以把 CUDA 想象成一个“GPU 软件开发的操作系统”,它不是一个单一的程序,而是由一整套核心组件组成的“超级工具箱”。

下面我们来看看构成 CUDA 的四大金刚 🔥


1️⃣ CUDA Runtime API(运行时 API)

💬 它是开发者最常打交道的接口,是你用 C/C++ 写 CUDA 程序的“入口”。

📌 功能包括:

  • GPU 内存分配和释放(cudaMalloc / cudaFree

  • 设备信息查询(cudaGetDeviceProperties

  • 启动 kernel(<<< >>> 语法就是它支持的)

🧠 类比一下:

就像你用 Python 写脚本,Python 帮你处理内存、线程这些底层细节,CUDA Runtime API 就是帮你“简单调用 GPU”。


 2️⃣ CUDA Driver API(驱动层 API)

🛠️ 更底层、更灵活、更复杂。适用于需要细粒度控制 GPU 资源的场景。

📌 功能包括:

  • 设备初始化与上下文管理(更手动)

  • 加载 PTX、模块化内核编程

  • 编译时更灵活地控制 GPU 行为

🎯 谁在用?

  • 深度学习框架开发者(例如 PyTorch 底层封装)

  • 系统级别的 GPU 控制和调优

🧠 类比一下:

Runtime API 是自动挡 🚗,Driver API 是手动挡赛车 🏎️,能玩得更极限,但也更难操作。


3️⃣ CUDA 核函数(Kernel Function)

🚀 这是你写的代码真正运行在 GPU 上的“主力部队”。

📌 特点:

  • __global__ 关键字声明

  • <<<grid, block>>> 语法来启动(指定并行粒度)

  • 每个线程独立执行一份 kernel 的代码

🧠 类比一下:

Kernel 像是“工厂车间的流水线工人”👷,你一次下达指令,成百上千个“工人”在不同岗位同步干活。

__global__ void add(int *a, int *b, int *c) {
   int i = threadIdx.x;
   c[i] = a[i] + b[i];
}

4️⃣ CUDA 内存模型(Memory Model)

💾 GPU 的内存系统是多层次的,用得好 = 性能飞起🚀

类型特性示例
Global Memory所有线程可访问,容量大,访问慢cudaMalloc 分配的内存
Shared Memory每个线程块共享,访问速度快__shared__ 声明
Local Memory每线程独享,实为全局空间局部变量(寄存器不足时)
Registers每线程专属,最快编译器自动分配
Constant Memory只读缓存,供所有线程共享,适合常量传递__constant__
Texture/Surface专用于图像处理,带缓存优化适合做图像/矩阵采样等

🧠 类比一下:

内存就像厨房里的原料分区,寄存器是你手边的调料台,Global memory 是仓库,Shared memory 是工位中间的调料包。

 


四、CUDA编程模型

1、CUDA程序的基本结构

🧱 CUDA 程序的基本结构:从 CPU 到 GPU 的“打工外包流程”

要写一个 CUDA 程序,其实核心流程就一句话:

🗣️ 主程序在 CPU 上运行,但把计算“打包”交给 GPU 干

下面我们一步步拆解这个“GPU 打工队”的工作流程 👷‍♂️


🧭 基本结构总览(5 个步骤)

一个典型 CUDA 程序结构可分为以下 5 步:

1️⃣ 准备数据(在 CPU 上)
2️⃣ 分配 GPU 内存并复制数据(Host ➡ Device)
3️⃣ 编写并调用 CUDA 核函数(Kernel)
4️⃣ 把计算结果从 GPU 拷回 CPU(Device ➡ Host)
5️⃣ 释放内存资源,程序结束


 🧪 示例:两个数组相加(Vector Add)

我们用一个经典的例子来演示 CUDA 程序的完整结构:向量加法

📌 功能:

c[i] = a[i] + b[i];

🧾 完整代码框架:

#include <stdio.h>
#include <cuda_runtime.h>

// CUDA 核函数:每个线程负责加一个元素
__global__ void vectorAdd(int *a, int *b, int *c, int n) {
    int i = threadIdx.x;
    if (i < n)
        c[i] = a[i] + b[i];
}

int main() {
    const int N = 10;
    int a[N], b[N], c[N];               // 在 CPU(host)上的数组
    int *d_a, *d_b, *d_c;               // GPU(device)上的指针

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

    // 1. 分配 GPU 内存
    cudaMalloc((void**)&d_a, N * sizeof(int));
    cudaMalloc((void**)&d_b, N * sizeof(int));
    cudaMalloc((void**)&d_c, N * sizeof(int));

    // 2. 拷贝数据到 GPU
    cudaMemcpy(d_a, a, N * sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(d_b, b, N * sizeof(int), cudaMemcpyHostToDevice);

    // 3. 启动 Kernel(让 GPU 干活!)
    vectorAdd<<<1, N>>>(d_a, d_b, d_c, N);

    // 4. 把结果拷回 CPU
    cudaMemcpy(c, d_c, N * sizeof(int), cudaMemcpyDeviceToHost);

    // 5. 打印结果
    printf("Result:\n");
    for (int i = 0; i < N; i++)
        printf("%d + %d = %d\n", a[i], b[i], c[i]);

    // 6. 释放 GPU 内存
    cudaFree(d_a); cudaFree(d_b); cudaFree(d_c);

    return 0;
}

🧠 每步拆解说明:

步骤内容说明 📝
1cudaMalloc在 GPU 上申请内存
2cudaMemcpy(Host ➡ Device)把 CPU 数据传给 GPU
3<<<blocks, threads>>> 启动 kernel设置并行维度、执行函数
4cudaMemcpy(Device ➡ Host)把结果从 GPU 拷回 CPU
5cudaFree清理资源,避免内存泄露

🔍 补充:线程模型简要说明

  • <<<1, N>>>:意思是启动 1 个 block,每个 block 有 N 个线程

  • threadIdx.x:获取当前线程在 block 中的编号(0 ~ N-1)

🧠 可以把每个线程想成一个“工人”,threadIdx.x 就是工号,它负责数组中第几个元素的加法。


📦 小贴士:想学得更好,可以试试…

  • N 改大点,看 GPU 性能

  • 改成 2D/3D grid/block,理解多维并行

  • 加个计时器看看 GPU 比 CPU 快多少(cudaEvent


✅ 小结一句话!

CUDA 程序结构 = 在 CPU 上安排好任务,然后启动成千上万个线程去 GPU 上“并行开工”💪

 


2、Kernel函数与线程层级

🧩 Kernel 函数与线程层级:并行计算的发动机 🚀

在 CUDA 编程中,我们不会一个个处理数据,而是:

把任务切片,丢给成千上万个线程同时运行!

这些线程由 GPU 上的 Kernel 函数统一调度执行。那么:

  • 什么是 Kernel 函数?

  • 怎么安排线程分工?

  • 什么是 Block、Grid、Thread?

接下来逐一拆解!


🔧 什么是 Kernel 函数?

Kernel 是 CUDA 程序中由 GPU 执行的函数,它是并行计算的核心。

__global__ void myKernel(...) {
    // 每个线程执行这段代码
}

🔹 __global__ 关键字告诉编译器:

这个函数运行在 GPU 上,但可以被 CPU 调用。

🔹 启动方式:

myKernel<<<gridSize, blockSize>>>(...);

这不是语法糖,而是在告诉 CUDA:

“我要启动多少线程来跑这个函数。”


 🧱 线程的三层层级结构

CUDA 中线程的组织就像军队建制,非常有层级感:

 

层级作用说明举例(1D)
Grid由多个 Block 组成(可以是1D/2D/3D)一个网格网(任务总量)
Block一个线程块,包含若干线程一组线程在同一块中
Thread最小执行单位每个处理一小段任务

 🧠 类比一下:

  • Grid:公司里的整个部门 🏢

  • Block:每个小组 👥

  • Thread:组员 👤


🧮 每个线程怎么知道“我是谁”?

CUDA 提供了 3 个内置变量,线程启动时自动可用:

变量说明类型
threadIdx当前线程在 Block 中的索引uint3
blockIdx当前 Block 在 Grid 中的索引uint3
blockDim每个 Block 有多少线程dim3
gridDimGrid 中有多少个 Blockdim3

🧠 小结一句话!

Kernel 是执行体,Grid 是组织方式,Thread 是计算单位
你写一次 Kernel,CUDA 帮你复制成千上万份“工人”去同时执行💥

 


3、内存管理与数据传输(Host ↔ Device)

💾 内存管理与数据传输(Host ↔ Device)

在 CUDA 编程中,CPU(Host)GPU(Device) 是两套完全独立的世界,它们各自有自己的内存空间:

🧠 CPU 内存 = 主内存(RAM)
🎮 GPU 内存 = 显存(VRAM)

CUDA 编程最重要的一步就是:

想办法把数据在 Host 和 Device 之间“搬来搬去” 🚚


 🧭 你必须搞懂的三件事:

内容作用类比(搬砖打工)
cudaMalloc()在 GPU 上分配显存给 GPU 准备砖堆 🧱
cudaMemcpy()Host ↔ Device 数据传输搬砖车来回运材料 🚛
cudaFree()释放 GPU 分配的内存资源工地收工,清理现场 🧹

🧪 示例代码:准备一批数据送去 GPU 加工

const int N = 100;
int a[N], b[N], c[N];
int *d_a, *d_b, *d_c;

// 1. 在 GPU 上分配内存
cudaMalloc((void**)&d_a, N * sizeof(int));
cudaMalloc((void**)&d_b, N * sizeof(int));
cudaMalloc((void**)&d_c, N * sizeof(int));

// 2. 把 CPU 上的原材料送到 GPU
cudaMemcpy(d_a, a, N * sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(d_b, b, N * sizeof(int), cudaMemcpyHostToDevice);

// 3. 执行 Kernel 计算(略)

// 4. 把结果从 GPU 拷回 CPU
cudaMemcpy(c, d_c, N * sizeof(int), cudaMemcpyDeviceToHost);

// 5. 清理资源
cudaFree(d_a);
cudaFree(d_b);
cudaFree(d_c);

🚥 cudaMemcpy 的四种传输方向

常量名从哪传 → 传到哪场景
cudaMemcpyHostToDevice🧠 CPU → 🎮 GPU把数据送去计算
cudaMemcpyDeviceToHost🎮 GPU → 🧠 CPU拿结果回来用
cudaMemcpyDeviceToDevice🎮 GPU → 🎮 GPUGPU 内部数据拷贝
cudaMemcpyHostToHost🧠 CPU → 🧠 CPU和普通 memcpy 类似

📦 内存管理流程图(逻辑图)

 


✅ 小结一句话

CUDA 内存管理 = 分配 + 拷贝 + 回收,像操作 GPU 的物流仓库一样💼

 

 💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!! 

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

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

相关文章

FPGA系列之DDS信号发生器设计(DE2-115开发板)

一、IP核 IP(Intellectual Property)原指知识产权、著作权等&#xff0c;在IC设计领域通常被理解为实现某种功能的设计。IP模块则是完成某种比较复杂算法或功能&#xff08;如FIR滤波器、FFT、SDRAM控制器、PCIe接口、CPU核等&#xff09;并且参数可修改的电路模块&#xff0c…

【Dv3Admin】从零搭建Git项目安装·配置·初始化

项目采用 Django 与 Vue3 技术栈构建&#xff0c;具备强大的后端扩展能力与现代前端交互体验。完整实现了权限管理、任务队列、WebSocket 通信、系统配置等功能&#xff0c;适用于构建中后台管理系统与多租户平台。 本文章内容涵盖环境搭建、虚拟环境配置、前后端部署、项目结…

P3416-图论-法1.BFS / 法2.Floyd

这道题虽然标签有floyd但是直接bfs也能过 其实事实证明还是bfs快&#xff0c;因为bfs只需要遍历特定的点&#xff0c;但是floyd需要考虑遍历所有可能的中介点 法1.BFS 用字典存储每个点所能普及的范围&#xff0c;然后用对每个点bfs进行拓展 nint(input())temp[]#xmax0;yma…

极狐GitLab 议题和史诗创建的速率限制如何设置?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 议题和史诗创建的速率限制 (BASIC SELF) 速率限制是为了控制新史诗和议题的创建速度。例如&#xff0c;如果您将限制设置为 …

提交到Gitee仓库

文章目录 注册配置公钥创建空白的码云仓库把本地项目上传到码云对应的空白仓库中 注册 注册并激活码云账号&#xff08; 注册页面地址&#xff1a;https://gitee.com/signup &#xff09; 可以在自己C盘/用户/用户名/.ssh 可以看到 有id_rsa.pub 以前在GitHub注册时搞过&…

oracle中错误总结

oracle中给表起别名不能用as&#xff0c;用as报错 在 Oracle 数据库中&#xff0c;​​WITH 子句&#xff08;即 CTE&#xff0c;公共表表达式&#xff09;允许后续定义的子查询引用前面已经定义的 CTE​​&#xff0c;但 ​​前面的 CTE 无法引用后面的 CTE​​。这种设计类似…

纽约大学具身智能体在城市空间中的视觉导航之旅!CityWalker:从海量网络视频中学习城市导航

作者&#xff1a;Xinhao Liu, Jintong Li, Yicheng Jiang, Niranjan Sujay, Zhicheng Yang, Juexiao Zhang, John Abanes, Jing Zhang, Chen Feng单位&#xff1a;纽约大学论文标题&#xff1a;CityWalker: Learning Embodied Urban Navigation from Web-Scale Videos论文链接&…

OpenCV颜色变换cvtColor

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 颜色变换是imgproc模块中一个常用的功能。我们生活中看到的大多数彩色图片都是RGB类型的&#xff0c;但是在进行图像处理时需要用到灰度图、二值图、HSV&#xff08;六角锥体模型&#xff0c;这个模型中颜色的…

Manus技术架构、实现内幕及分布式智能体项目实战

Manus技术架构、实现内幕及分布式智能体项目实战 模块一&#xff1a; 剖析Manus分布式多智能体全生命周期、九大核心模块及MCP协议&#xff0c;构建低幻觉、高效且具备动态失败处理能力的Manus系统。 模块二&#xff1a; 解析Manus大模型Agent操作电脑的原理与关键API&#xf…

下载油管视频 - yt-dlp

文章目录 1. yt-dlp与you-get介绍1.1 主要功能对比1.2 使用场景1.3 安装 2. 基本命令介绍2.1 默认下载视频2.2 指定画质和格式规则2.3 下载播放列表2.4 备注 3. 参考资料 之前只使用you-get下载b站视频&#xff0c;当时了解you-get也可下载油管视频&#xff0c;但之前无此需求&…

济南通过首个备案生活服务大模型,打造行业新标杆

近日&#xff0c;一则振奋人心的消息在人工智能领域传开&#xff1a;济南本土企业丽阳神州智能科技有限公司自主研发的 “丽阳雨露” 大模型成功通过国家网信办的备案。这一成果不仅是济南企业在科技创新道路上的重大突破&#xff0c;更标志着我国在生活服务领域的人工智能应用…

第6次课 贪心算法 A

向日葵朝着太阳转动&#xff0c;时刻追求自身成长的最大可能。 贪心策略在一轮轮的简单选择中&#xff0c;逐步导向最佳答案。 课堂学习 引入 贪心算法&#xff08;英语&#xff1a;greedy algorithm&#xff09;&#xff0c;是用计算机来模拟一个「贪心」的人做出决策的过程…

Hexo+Github+gitee图床零成本搭建自己的专属博客

一个详细、完善的 Hexo 博客部署教程&#xff0c;不仅涵盖了基本的安装、配置、生成与部署步骤&#xff0c;还增加了常见问题的解决、主题设置、图片上传等 在开始之前可以看看我最终搭建出来的成果&#xff1a;https://liangjh.blog 1.安装git和nodejs 在Windows上使用Git&a…

数字信号处理技术架构与功能演进

数字信号处理&#xff08;DSP&#xff09;是通过数字运算实现信号分析、变换、滤波及调制解调的技术领域&#xff0c;其发展过程与技术应用如下&#xff1a; 一、定义与核心功能 技术定义&#xff1a;通过算法将模拟信号转换为数字形式进行处理&#xff0c;具有高精度、可编程…

深入理解 Android Handler

一、引言 Handler 在安卓中的地位是不言而喻的&#xff0c;几乎维系着整个安卓程序运行的生命周期&#xff0c;但是这么重要的一个东西&#xff0c;我们真的了解它吗&#xff1f;下面跟随着我的脚步&#xff0c;慢慢揭开Hanler的神秘面纱吧&#xff01; 本文将介绍Handler 的运…

C++ 什么是隐式类型转换,什么是显式类型转换

在 C 中&#xff0c;​​类型转换​​是将一种数据类型的值转换为另一种数据类型的过程&#xff0c;分为 ​​隐式类型转换​​&#xff08;由编译器自动完成&#xff09;和 ​​显式类型转换​​&#xff08;由程序员手动指定&#xff09;。以下是它们的区别和示例&#xff1a…

NVIDIA 自动驾驶技术见解

前言 参与 NVIDIA自动驾驶开发者实验室 活动&#xff0c;以及解读了 NVIDIA 安全报告 自动驾驶 白皮书&#xff0c;本文是我的一些思考和见解。自动驾驶技术的目标是为了改善道理安全、减少交通堵塞&#xff0c;重塑更安全、高效、包容的交通生态。在这一领域&#xff0c;NVI…

【Flask】Explore-Flask:早期 Flask 生态的实用指南

开源项目&#xff1a;explore-flask/README.rst at master rpicard/explore-flask (github.com) 一、Coding conventions Summary Try to follow the coding style conventions laid out in PEP 8. Try to document your app with docstrings as defined in PEP 257. def…

【论文阅读21】-PSOSVM-CNN-GRU-Attention-滑坡预测(2024-12)

这篇论文主要提出并验证了一种新型的混合智能模型&#xff08;PSOSVM-CNN-GRU-Attention&#xff09;&#xff0c;用于准确预测滑坡的点位移&#xff0c;并构建可靠的位移预测区间。通过对Baishuihe滑坡和Shuping滑坡的案例分析&#xff0c;展示了该模型的出色性能。 [1] Zai D…

蓝牙 6.0 发布,解锁无线科技新可能

在5G和Wi-Fi 7高速发展的时代&#xff0c;蓝牙技术始终以独特优势深度融入日常生活。从无线耳机到智能家居&#xff0c;它凭借低功耗、高兼容的特性&#xff0c;悄然连接各类智能设备&#xff0c;打造无缝的数字生活体验。无论是聆听音乐、智能门禁还是健康监测&#xff0c;蓝牙…