cuda编程与gpu并行计算(三):一个小demo了解cuda基本语法

gpu程序的一般步骤

  1. CPU分配空间给GPU(cudaMalloc)
  2. CPU复制数据给GPU(cudaMemcpy)
  3. CPU加载kernels给GPU做计算(Kernel核: 可以理解为C/C++中的一个函数function)
  4. CPU把GPU计算结果复制回来

过程中,一般要尽量降低数据通讯的消耗,所以如果程序需要复制大量的数据到GPU,显然不是很合适使用GPU运算,最理想的情况是,每次复制的数据很小,然后运算量很大,输出的结果还是很小,复制回CPU。

先做一个小demo,对一个8位数组求平方,很简单
global 关键字那个函数就是在GPU上运行,我们先写完kernel,那还需要从cpu拿数据过去也就是上面的1和2 这里我们为了区分cpu和gpu变量,用h_表示cpu变量(host),用d_表示gpu变量(device),host和device我们在之前的概论提了这里就不解释了。

#include <stdio.h>

//这个就是kernel
__global__ void square(float* d_out,float* d_in){
  int idx = threadIdx.x;
  float f = d_in[idx];
  d_out[idx] = f * f;
}

int main(int argc,char** argv){
  const int ARRAY_SIZE = 8;
  const int ARRAY_BYTES = ARRAY_SIZE * sizeof(float);

  // 在cpu中定义要输入的数组
  float h_in[ARRAY_SIZE];
  for(int i=0;i<ARRAY_SIZE;i++){
    h_in[i] = float(i);
  }
  float h_out[ARRAY_SIZE];

  // 声明gpu指针
  float* d_in;
  float* d_out;

  // 对应1步骤,给gpu指针分配内存空间,和cpu上的数据空间一样大
  cudaMalloc((void**) &d_in,ARRAY_BYTES);
  cudaMalloc((void**) &d_out,ARRAY_BYTES);

  // 对应步骤2,把cpu数据复制给gpu
  cudaMemcpy(d_in,h_in,ARRAY_BYTES,cudaMemcpyHostToDevice);

  // 对应步骤3,把kernel也就是square,加载到gpu上运行,1是一个线程块,其中有64个线程,1个时钟周期就可以结束运算
  square<<<1,ARRAY_SIZE>>>(d_out,d_in);

  // 对应步骤4,把gpu数据复制给cpu
  cudaMemcpy(h_out,d_out,ARRAY_BYTES,cudaMemcpyDeviceToHost);

  // 输入结果
  for(int i=0;i<ARRAY_SIZE;i++){
    printf("%f",h_out[i]);
    printf(((i%4) != 3) ? "\t" : "\n");
  }

  // 释放内存
  cudaFree(d_in);
  cudaFree(d_out);

  return 0;


}

那我们运行一下看看,先编译,cuda 程序后缀是.cu

nvcc -o square square.cu

在这里插入图片描述在这里插入图片描述square就是我们刚编译出来的程序

运行一下看看
在这里插入图片描述结果就是0-7的平方,正确

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CUDA编程是一种用于GPU并行计算编程模型,它由NVIDIA推出并应用于其显卡产品系列。通过CUDA编程,开发者可以利用GPU并行计算能力来加速各种计算任务。下面是一些关于CUDA编程GPU并行计算的重要概念: 1. GPU:图形处理器(Graphics Processing Unit)是一种专门用于处理图形和并行计算的硬件设备。与传统的中央处理器(CPU)相比,GPU具有更多的核心和更高的内存带宽,适合并行计算任务。 2. CUDA:Compute Unified Device Architecture(CUDA)是一种并行计算平台和编程模型,用于利用GPU进行通用目的的并行计算CUDA提供了一套API和工具,使开发者能够直接在GPU上编写并运行并行计算代码。 3. 核函数(Kernel Function):在CUDA编程中,开发者可以定义一个称为核函数的特殊函数。核函数在GPU上并行执行,并且每个线程都会独立地执行该函数。通过合理设计核函数,开发者可以利用GPU并行计算能力来加速各种计算任务。 4. 线程、块和网格:在CUDA编程中,GPU上的并行计算是以线程为基本单位进行的。线程被组织成块(block),而块又可以组织成网格(grid)。开发者可以通过调整块和网格的大小来优化并行计算的性能。 5. 内存管理:CUDA提供了多种类型的内存,开发者可以根据需要选择合适的内存类型。其中,全局内存(Global Memory)是GPU上所有线程都可以访问的共享内存,而共享内存(Shared Memory)是块内线程共享的高速缓存。合理地使用不同类型的内存可以提高并行计算的效率。 通过CUDA编程,开发者可以将适合并行计算的任务分配给GPU来加速处理。这种方式在科学计算、深度学习、图像处理等领域得到广泛应用,能够显著提高计算性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值