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个线程进行计算
相关推荐
yanxing.D24 分钟前
penCV轻松入门_面向python(第七章 图像平滑处理)
图像处理·人工智能·opencv·计算机视觉
骥龙1 小时前
1.1、开篇:AI如何重塑网络安全攻防格局?
人工智能·安全·web安全
微学AI1 小时前
国产数据库替代MongoDB的技术实践过程:金仓多模数据库在电子证照系统中的深度应用
数据库·人工智能·1024程序员节
gddkxc1 小时前
AI驱动的客户管理:悟空AI CRM的核心功能与优势
人工智能
狂奔solar2 小时前
Apple 开源FastVLM:AI看图说话更快更准
人工智能
星空的资源小屋2 小时前
Antares SQL,一款跨平台开源 SQL 客户端
数据库·人工智能·pdf·开源·电脑·excel·1024程序员节
集和诚JHCTECH2 小时前
赋能边缘智能:BRAV-7722搭载全新Edge BMC模块,开启远程运维新纪元!
人工智能·嵌入式硬件
WLJT1231231232 小时前
生活电器:重构家居体验的产业变革与发展探索
大数据·人工智能·科技·生活
~~李木子~~2 小时前
聚类算法实战:从 KMeans 到 DBSCAN
人工智能·机器学习·支持向量机