CUDA程序编写 【参加CUDA线上训练营】

目录

关键字/标识符

__global__

__device__

__host__

核函数

编程步骤

编译方法

性能检测工具

关键字/标识符

__global__

__global__ 执行空间说明符将函数声明为内核。

  • 在设备上执行;
  • 可从主机调用,可在计算能力为 3.2 或更高的设备调用;
  • __global__ 函数必须具有 void 返回类型,并且不能是类的成员;
  • 对 __global__ 函数的任何调用都必须指定其执行配置,如执行配置中所述;
  • 对 __global__ 函数的调用是异步的,这意味着它在设备完成执行之前返回。

__device__

__device__ 执行空间说明符声明了一个函数。

  • 在设备上执行,
  • 只能从设备调用。
  • __global__ 和 __device__ 执行空间说明符不能一起使用。

__host__

  • __host__ 执行空间说明符声明了一个函数:
  • 在主机上执行,
  • 只能从主机调用。
  • 相当于声明一个函数只带有 __host__ 执行空间说明符,或者声明它没有任何 __host__ 、__device__ 或 __global__ 执行空间说明符; 在任何一种情况下,该函数都仅为主机编译。

__global__ 和 __host__ 执行空间说明符不能一起使用;

__device__和__host__可以一起使用。

核函数

函数定义:

__global__ void hello_cuda()  { }

 函数调用:

hello_cuda<<<BlockPerGrid,ThreadPerBlock>>>();

BlockPerGrid:每个grid中含有的block数

        计算公式:BlockPerGrid= (N + ThreadPerBlock- 1) / ThreadPerBlock   N为数据个数?

ThreadPerBlock:每个block中含有thread数,推荐128.

编程步骤

1、赋初值:分配空间(维度、字节数)

2、初始化设备

3、分配主机cpu内存:malloc();

4、分配设备gpu内存:cudaMalloc(float(**)&addr,n*sizeof(float))

5、启动核函数:主机拷贝到设备,完成后设备拷贝到主机

        cudaError_t cudaMemcpy(void *dist, const void* src,size_t count,CudaMemcpyKind kind)

6、释放资源:free();cudafree();

编译方法

nvcc hello_gpu.cu -o hello_gpu

性能检测工具

工具:nvprof

sudo /usr/local/cuda/bin/nvprof --print-api-trace ./a.out

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编写CUDA程序主要包含以下步骤: 1. 定义GPU核心函数:使用`__global__`关键字修饰函数,表示该函数在GPU上运行。例如: ``` __global__ void myKernel(float* input, float* output, int size) { int tid = blockIdx.x * blockDim.x + threadIdx.x; if (tid < size) { output[tid] = input[tid] * 2; } } ``` 2. 在主函数中分配GPU内存:使用`cudaMalloc`函数分配GPU内存,并使用`cudaMemcpy`函数将数据从主机内存拷贝到GPU内存。例如: ``` int size = 100; float* input_host = (float*)malloc(size * sizeof(float)); float* output_host = (float*)malloc(size * sizeof(float)); for (int i = 0; i < size; i++) { input_host[i] = i; } float* input_device; float* output_device; cudaMalloc(&input_device, size * sizeof(float)); cudaMalloc(&output_device, size * sizeof(float)); cudaMemcpy(input_device, input_host, size * sizeof(float), cudaMemcpyHostToDevice); ``` 3. 调用GPU核心函数:使用`<<<blocks, threads>>>`语法调用GPU核心函数。其中,`blocks`表示块的数量,`threads`表示每个块中线程的数量。例如: ``` int threads_per_block = 32; int blocks_per_grid = (size + threads_per_block - 1) / threads_per_block; myKernel<<<blocks_per_grid, threads_per_block>>>(input_device, output_device, size); ``` 4. 将计算结果从GPU内存拷贝回主机内存:使用`cudaMemcpy`函数将计算结果从GPU内存拷贝回主机内存。例如: ``` cudaMemcpy(output_host, output_device, size * sizeof(float), cudaMemcpyDeviceToHost); ``` 5. 释放GPU内存:使用`cudaFree`函数释放GPU内存。例如: ``` cudaFree(input_device); cudaFree(output_device); ``` 需要注意的是,CUDA程序编写需要掌握GPU并行计算的原理和CUDA API函数的使用方法,同时需要对GPU硬件和CUDA程序进行优化,以提高程序的性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值