GPU编程

GPU编程既要考虑CPU硬件也要考虑GPU硬件。这种编程称为异构编程

代码从CPU上开始执行,遇到需要大量并行化的部分,再到GPU上并行,然后将结果返还给CPU再进行其他可能的计算。

CPU上的向量加法

  • 开辟内存空间,
  • 初始化两个向量,
  • 循环相加,或者使用向量化的相加
  • 释放内存

这种计算效率很受带宽限制,例如下面代码要计算长度为100万的两向量加法

cpp 复制代码
#include <iostream>
int main(void) {
int N = 1<<20; // 1M elements
float *x = new float[N]; // Allocate memory
float *y = new float[N];
// initialize x and y on the CPU
for (int i = 0; i < N; i++) {
 x[i] = 1.0f; y[i] = 2.0f;
}
    
// Run on 1M elements on the CPU
add(N, x, y);
    
// Free memory
delete [] x; delete [] y;
return 0;
}

GPU上的向量加法

在GPU上执行的函数称为内核函数(kernel),由CPU调用内核函数

  • GPU上开辟内存空间(显存)
  • 将数据复制到GPU上
  • 执行内核函数
  • 等待计算
  • 将结果返还给CPU

GPU串行计算向量加法

cpp 复制代码
float *x = new float[N];
float *y = new float[N];
int size = N*sizeof(float);
float *d_x, *d_y; // device copies of x y
cudaMalloc((void **)&d_x, size);//GPU上开辟内存
cudaMalloc((void **)&d_y, size);//GPU上开辟内存
cudaMemcpy(d_x, x, size, cudaMemcpyHostToDevice);//CPU到GPU转移数据
cudaMemcpy(d_y, y, size, cudaMemcpyHostToDevice);//CPU到GPU转移数据
// Run kernel on GPU
add<<<1,1>>>(N, d_x, d_y);//调用内核代码,<<<1,1>>>表示使用单线程计算
// Copy result back to host
cudaMemcpy(y, d_y, size, cudaMemcpyDeviceToHost);//将结果返还给CPU
// Free memory
cudaFree(d_x); cudaFree(d_y);
delete [] x; delete [] y;


// GPU function to add two vectors
__global__ //添加关键字表示以下函数为内核函数
void add(int n, float *x, float *y) {
for (int i = 0; i < n; i++)
y[i] = x[i] + y[i];
}

如果想要利用并行性计算提升计算速度,则要使用多个线程同时计算。需要改写kernel函数

cpp 复制代码
// GPU function to add two vectors
__global__
void add(int n, float *x, float *y) {
int index = threadIdx.x;//CUDA线程的索引
y[index] = x[index] + y[index];
}

add<<<1,256>>>(N, d_x, d_y);//使用一个线程块中的256个线程进行计算
相关推荐
灵动的艺术5 小时前
如一 Agent 架构解读(二十四):Agent 高效率低成本思考
人工智能·agent·如一
Xxtaoaooo5 小时前
双11避坑:我用 WorkBuddy + TextIn xParse 做了个「避坑对比台」,商品详情图丢进去,参数矛盾自动现形
人工智能·1024程序员节·textin·workbuddy·ai数据层基础设施
昵称画6 小时前
交接班记录电子化:三班之间的信息不漏
开发语言·数据库·人工智能·低代码·php
Navicat中国6 小时前
将 Navicat 的 AI 助手连接到本地 LLM
人工智能·chatgpt
“AI国潮设计-小江”6 小时前
【AIGC实战】Python+SDXL批量生成“潮汕英歌舞不倒翁”IP | 角色一致性与多场景融合方案,附完整代码
开发语言·人工智能·python·prompt·aigc
点PY6 小时前
WeDetect论文精读
人工智能
CCC:CarCrazeCurator6 小时前
稀疏奖励 vs 稠密奖励:强化学习中的反馈带宽权衡
人工智能·深度学习·机器人
骑着蜗牛撵大象3276 小时前
语音变分录、规则挡幻觉:拆解开源 AI 记账系统 Smart Ledger 的全栈设计
人工智能·ai·架构·js·数据校验
墨染天姬6 小时前
[AI]Cursor Subagent 机制详解
人工智能
数睿数据无代码开发6 小时前
企业AI落地从高价值场景开始|数睿数据《AI应用场景集》正式发布
人工智能