返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

【AI】来Get下CUDA

[复制链接]
链载Ai 显示全部楼层 发表于 半小时前 |阅读模式 打印 上一主题 下一主题

最近在GPU上部署模型,才了解到CUDA,废话少说,来了解下CUDA!


看效果


ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: var(--articleFontsize);letter-spacing: 0.034em;text-align: justify;">

这是2个向量的加法的加法,使用GPU来计算的!


话原理


概念


CUDA stands for Compute Unified Device Architecture,是英伟达开发的并行计算和编程的框架,使得开发者可以使用GPU用于通用处理任务,而不仅仅局限于图形渲染!


这里我们理解下GPU,对比CPU的计算单元,可以看到GPU的计算很多!


NVIDIA GPU 的并行计算的工作流程,在代码上分为两步:


1. CPU 调用核函数的函数,该函数由 GPU 执行。


2. GPU 根据给定的并行量,并行执行该函数。


CUDA 中,执行核函数的一个基本单位被称为线程(thread)。若干个 thread 组合成线程块(block),而一次调用中所有的线程块组成了一个网格(grid)


CPU 调用核函数的同时,会指定执行该核函数的线程块数量和每个线程块中线程的数量。这也就意味着,核函数中的内容会被并行地执行线程块的数量 ×每个线程块内的线程数量次!


核函数


  • __global__ 是 CUDA C/C++ 的函数修饰符,表示该函数为核函数


  • 核函数会在 GPU 上执行,但由主机代码调用


  • 返回类型必须为 void


  • 在调用kernel函数时,函数名后的<<<b, t>>>:b代表线程块的数目,t代表每个线程块的线程数目。


__global__voidmyKernel(){printf("Helloworld\n");}intmain(intargc,charconst*argv[]){myKernel<<<4,2>>>();return0;}


比如这个代码,是4个线程块和每个线程块中2个线程来执行,就会输出8个 hello world


其他,比如内存的分配和回收;主机(CPU)和设备(GPU)之前的数据传输,错误处理等


本次的CUDA编程会涉及到如下的环节


1)定义CUDA核函数vectoradd,是__global__ void


这里说明了向量相加,,这个就是核函数,是GPU来运行


2)定义主函数 main,


  • 定义参数


  • 分配GPU的内存


  • 初始化数据


  • 将数据从主机内存复制到设备内存


  • 调用CUDA核函数


  • 将结果从设备内存复制回主机内存


  • 打印结果


  • 释放GPU内存


来实践

1)先申请GPU或本地有,我申请是RTX 4090,大概¥2.7一个小时,内存120G,CPU 16核
2)安装cuda toolkit,我是直接云镜像安装了,cuda 11
3)配置cuda变量环境
Sudovi/root/.bashrc
4)创建cuda文件
sudovimcuda_program.cu
文件中的代码如下
//示例:vector_add.cu#include//CUDA核函数,对两个向量进行加法操作__global__voidvectorAdd(int*a,int*b,int*c,intn){inttid=blockIdx.x*blockDim.x+threadIdx.x;if(tid<n)c[tid]=a[tid]+b[tid];}intmain(){intn=10;inta[n],b[n],c[n];int*dev_a,*dev_b,*dev_c;//分配GPU内存cudaMalloc((void**)&dev_a,n*sizeof(int));cudaMalloc((void**)&dev_b,n*sizeof(int));cudaMalloc((void**)&dev_c,n*sizeof(int));//初始化数据for(inti=0;i<n;i++){a[i]=i;b[i]=i*i;}//将数据从主机内存复制到设备内存cudaMemcpy(dev_a,a,n*sizeof(int),cudaMemcpyHostToDevice);cudaMemcpy(dev_b,b,n*sizeof(int),cudaMemcpyHostToDevice);//定义CUDA核函数调用配置dim3blocksPerGrid(1);dim3threadsPerBlock(n);//调用CUDA核函数vectorAdd<<>>(dev_a,dev_b,dev_c,n);//将结果从设备内存复制回主机内存cudaMemcpy(c,dev_c,n*sizeof(int),cudaMemcpyDeviceToHost);//打印结果printf("Vectoradditionresult:\n");for(inti=0;i<n;i++){printf("%d+%d=%d\n",a[i],b[i],c[i]);}//释放GPU内存cudaFree(dev_a);cudaFree(dev_b);cudaFree(dev_c);return0;}
5) nvcc编译
nvcc-ocuda_programcuda_program.cu
这里会生成一个可执行的cuda_program文件
6) 执行
./cuda_program

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: var(--articleFontsize);letter-spacing: 0.034em;background-color: rgb(250, 250, 250);">写在最后

最近去周末闲着去看了下教育房子,看到好的教育资源这么近,仿佛是另外一个世界,第一次这么现实,难免感概!(如果上天....我愿意苦10年让我的孩子能接受更好的教育)简直是一个太振奋人心的信息!


也像一个梦,一个奋斗的梦,这个梦是我期望我的后代的接受教育,我们都生活在现实中!有真实的现在!我是否应该去四处奔走争取,未来12年后,会为了这次的没去争取而遗憾吗......


模型的部署的比想象中的麻烦,我申请好了云GPU,预装了CUDA镜像,但是,模型咋都下载不下来,我现在正在从公hugging face上下载,,巨慢已经下载近2天了...keep moving!


beads 珠子


Paleolithic period 旧石器时代


slabs 厚板


in galleries immediately off the inhabited areas of caves


bare walls裸露的墙壁


no backdrops(背景) or environmental trappings


depicted(描绘) in cave art


sought to 寻求


evidence of chips(碎片) in the painted figures


chief motivation


herds of game成群的猎物


explicitly revealed


bovines牛科动物


meatier 多肉的


tusks and horns 象牙和角


unpredctability


mammoths(长毛象), bovines, and horses


reindeer 驯鹿


was not confined to 不局限于


shafts 竖井


notation 符号,记号


artworks 艺术品


an expression of a desire for fertility 渴望生育


参考


https://dingfen.github.io/mpi&openmp/2021/10/08/cuda-beginer.html


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ