CUDA By Example笔记--Cuda C并行编程实例

1--并行实现数组相加

        定义两个数组 a 和 b,通过在 GPU 上实现两个数组的并行相加;

#include <iostream>
#include "cuda_runtime.h"

#define N 10

// From book.h
#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))
static void HandleError( cudaError_t err,
                         const char *file,
                         int line ) {
    if (err != cudaSuccess) {
        printf( "%s in %s at line %d\n", cudaGetErrorString( err ),
                file, line );
        exit( EXIT_FAILURE );
    }
}

// Add 函数
__global__ void add(int *a, int *b, int *c){
    int tid = blockIdx.x;
    if (tid < N)
        c[tid] = a[tid] + b[tid];
}

int main(void){
    int a[N], b[N], c[N];
    int *dev_a, *dev_b, *dev_c;

    // 在GPU上分配内存
    HANDLE_ERROR(cudaMalloc( (void**)&dev_a, N*sizeof(int) ));
    HANDLE_ERROR(cudaMalloc( (void**)&dev_b, N*sizeof(int) ));
    HANDLE_ERROR(cudaMalloc( (void**)&dev_c, N*sizeof(int) ));

    // 在CPU上为数组 'a' 和 'b'赋值
    for (int i = 0; i < N; i++){
        a[i] = -i;
        b[i] = i * i;
    }

    // 将数据从主机复制到 GPU 当中
    HANDLE_ERROR(cudaMemcpy( dev_a, a, N*sizeof(int), cudaMemcpyHostToDevice));
    HANDLE_ERROR(cudaMemcpy( dev_b, b, N*sizeof(int), cudaMemcpyHostToDevice));

    add<<<N, 1>>>(dev_a, dev_b, dev_c);

    // 将结果从 GPU 复制到 主机中
    HANDLE_ERROR(cudaMemcpy( c, dev_c, N*sizeof(int), cudaMemcpyDeviceToHost));

    // 打印结果
    for (int i = 0; i < N; i++){
        printf("%d + %d = %d\n", a[i], b[i], c[i]);
    }

    // 释放在 GPU 中分配的内存
    cudaFree(dev_a);
    cudaFree(dev_b);
    cudaFree(dev_c);

    return 0;
}

         代码解读:

        通过修饰符__global__声明核函数;

        add<<<N, 1>>>(dev_a, dev_b, dev_c) 中的参数 N 表示设备在执行核函数 add() 时使用的并行线程块数量;

        blockIdx.x 是一个内置变量,其值表示执行当前设备代码的线程块的索引;

        当启动核函数时,若将并行线程块的数量指定为N,这个并行线程块集合则称为一个线程格 (Grid);第一个线程格的blockIdx.x为 0,最后一个线程格的 blockIdx.x 为 N - 1;

        注意事项:在启动线程块数组时,数组每一维的最大数量不能超过65 535(硬件限制),否则程序将运行失败;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值