当前位置: 首页 > news >正文

CUDA编程入门代码

一、CUDA核心概念

  1. Host与Device

    • Host‌:CPU及其内存,负责控制流程和复杂逻辑‌。
    • Device‌:GPU及其显存,专为并行计算设计,需通过PCIe总线与Host通信‌。
  2. Kernel函数

    • __global__修饰,在GPU上并行执行的函数,通过<<<grid, block>>>语法指定线程规模‌。
  3. 线程层次结构

    • Thread‌:最小执行单元,通过threadIdx定位‌。
    • Block‌:包含多个线程(最多1024个),块内线程可共享内存(Shared Memory)并通过__syncthreads()同步‌。
    • Grid‌:多个Block的集合,通过blockIdx定位‌。
  4. 内存模型

    • 全局内存(Global Memory)‌:所有线程可访问,容量大但延迟高‌。
    • 共享内存(Shared Memory)‌:Block内共享,速度接近寄存器‌。
    • 常量内存 (Constant Memory):只读内存,适用于在内核执行期间不改变的值。访问速度较快(当所有线程访问相同地址时)。
    • 纹理内存 (Texture Memory):专门用于处理图像和纹理数据的只读内存。提供缓存机制,适合进行空间局部性访问。支持各种过滤和坐标变换。
    • 寄存器(Registers)‌:线程私有,访问最快‌。

二、CUDA编程步骤

  1. 环境配置

    • 安装CUDA Toolkit(如v11.8或更高)并验证nvidia-smi输出‌。
  2. 第一个CUDA程序,比如test.cu文件

    #include "cuda_runtime.h"
    #include "device_launch_parameters.h"
    #include <stdio.h>
    
    __global__ void vector_add(float *a, float *b, float *c, int size){
    	int tid = blockIdx.x*blockDim.x + threadIdx.x;
    	if(tid < size){
    		c[tid] = a[tid] + b[tid];
    	}
    }
    
    int main() {
    	int size = 1000;
    	float *a, *b, *c, *c_host;
    	c_host = (float*)malloc(sizeof(float)*size);
    	//设备内存分配
    	cudaMalloc(&a, sizeof(float)*size);
    	cudaMalloc(&b, sizeof(float)*size);
    	cudaMalloc(&c, sizeof(float)*size);
    
    	//初始化及数据传输
    	float a_host[1000];
    	float b_host[1000];
    	int n = 0;
    	for(n=0; n<size; n++){
    		a_host[n] = 1.0;
    		b_host[n] = 99.0;
    	}
    	cudaMemcpy(a,a_host,sizeof(float)*size,cudaMemcpyHostToDevice);
    	cudaMemcpy(b,b_host,sizeof(float)*size,cudaMemcpyHostToDevice);
    	//
    
    	dim3 block(256); //每Block 256线程
    	dim3 grid((size+256-1)/256);//计算所需Block数(这里根据size计算)
    	vector_add<<<grid,block>>>(a,b,c,size);
    	
    	//结果回传到主机内存
    	cudaMemcpy(c_host,c,sizeof(float)*size,cudaMemcpyDeviceToHost);
        cudaDeviceSynchronize();  // 等待GPU执行完成
    
    	printf("host data head:%.2f tail:%.2f\n", c_host[0], c_host[size-1]);
    
    	cudaFree(a);
    	cudaFree(b);
    	cudaFree(c);
    	free(c_host);
    
        return 0;
    }

    编译命令:

    nvcc test.cu -o test
  3. 内存管理
    使用cudaMalloc分配设备内存,cudaFree释放设备内存。
    使用cudaMallocHost/malloc分配主机内存,使用cudaFreeHost/free释放主机内存。
    cudaMemcpy在Host与Device间传输数据‌。
    cudaMemcpy(deviceA, hostA, size, cudaMemcpyHostToDevice); 从主机到设备复制数据。
    cudaMemcpy(hostB, deviceB, size, cudaMemcpyDeviceToHost);从设备到主机复制暑假。


文章转载自:

http://HimGqwEi.hypqh.cn
http://Hl7DLTcV.hypqh.cn
http://z3NLiBMg.hypqh.cn
http://vG30gcpy.hypqh.cn
http://Jot33V7G.hypqh.cn
http://sho3Xf8X.hypqh.cn
http://b3qsXW0a.hypqh.cn
http://T498Ao7n.hypqh.cn
http://a2tM5PoW.hypqh.cn
http://qk7JdBux.hypqh.cn
http://vfp6ugiD.hypqh.cn
http://y5xps1bY.hypqh.cn
http://DPyiNlAJ.hypqh.cn
http://dONujfv3.hypqh.cn
http://79spiAjM.hypqh.cn
http://DqZ9Z4ti.hypqh.cn
http://DQ2tQNBd.hypqh.cn
http://lqujQ1NC.hypqh.cn
http://tQuss520.hypqh.cn
http://ABVEbTGM.hypqh.cn
http://jGMlNNtp.hypqh.cn
http://dqmdRWRZ.hypqh.cn
http://8Sz8kFRx.hypqh.cn
http://2AmVwduM.hypqh.cn
http://GmWN883Y.hypqh.cn
http://1aAcJcee.hypqh.cn
http://dNaxZcQ4.hypqh.cn
http://wDyG0u3n.hypqh.cn
http://juH3TM8Y.hypqh.cn
http://gFAkwIls.hypqh.cn
http://www.dtcms.com/a/57627.html

相关文章:

  • VUE叉的工作原理?
  • mysql下载与安装、关系数据库和表的创建
  • 【LLM学习】1-NLP回顾+Pytorch复习
  • 如何快速辨别zip压缩包伪加密
  • 系统架构设计师—系统架构设计篇—微服务架构
  • 【AI实践】基于TensorFlow/Keras的CNN(卷积神经网络)简单实现:手写数字识别的工程实践
  • 【玩转23种Java设计模式】结构型模式篇:组合模式
  • (最新教程)Cursor Pro订阅升级开通教程,使用支付宝订阅Cursor Pro Plus
  • saltstack通过master下发脚本批量修改minion_id,修改为IP
  • Spring使用@Scheduled注解的参数详解
  • 【数据仓库与数据挖掘基础】决策分析
  • ChromeDriver下载 最新版本 134.0.6998.35
  • WebUSB的常用API及案例
  • 【Python 数据结构 10.二叉树】
  • 爬虫案例七Python协程爬取视频
  • c++ auto关键字
  • SQL经典查询
  • 基于DeepSeek实现PDF嵌入SVG图片无损放大
  • CarPlanner:用于自动驾驶大规模强化学习的一致性自回归轨迹规划
  • 修改jupyter notebook的工作空间
  • HCIA复习拓扑实验
  • 兴业银行的笔试题及答案(2025)
  • 数据安全防线:备份文件的重要性与自动化实践
  • 计算机组成原理:数据表示的基本概念
  • 如何在Ubuntu上直接编译Apache Doris
  • mysql虚拟列
  • 基于SpringBoot的商城管理系统(源码+部署教程)
  • .Net 6 上传文件接口 文件大小报错整体配置
  • ARMv8寄存器的介绍
  • 【十三】Golang 通道