VS2017 CUDA编程学习4:CUDA并行处理初探 - 向量加法实现
文章目录
- 前言
- CUDA实现向量加法
- 2. 结果展示
- 总结
- 学习资料
VS2017 CUDA编程学习1:CUDA编程两变量加法运算
VS2017 CUDA编程学习2:在GPU上执行线程
VS2017 CUDA编程学习3:CUDA获取设备上属性信息
前言
今天开始见识下CUDA编程的并行处理能力,这里做下笔记并分享给大家。
CUDA实现向量加法
为了体现CUDA并行处理能力,这里也实现了CPU上向量加法程序,通过分别统计运行时间来证明CUDA的并行处理优势。
#include <stdio.h>
#include <iostream>
#include <time.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>#define N 1000//内核(Gpu设备)函数实现向量加法
__global__ void GpuAdd(int* d_a, int* d_b, int* d_c)
{int idx = blockIdx.x;d_c[idx] = d_a[idx] + d_b[idx];printf("blockIdx %d\n", idx);
}//CPU函数实现向量加法
void CpuAdd(int* h_a, int* h_b, int* h_c)
{for (int i = 0; i < N; i++){h_c[i] = h_a[i] + h_b[i];printf("index %d\n", i);}
}int main()
{//定义host变量数组int h_a[N], h_b[N], h_c[N];//定义Gpu设备指针int* d_a, *d_b, *d_c;//为Gpu设备指针分配内存cudaMalloc(&d_a, N * sizeof(int));cudaMalloc(&d_b, N * sizeof(int));cudaMalloc(&d_c, N * sizeof(int));//初始化host变量数组for (int i = 0; i < N; i++){h_a[i] = 2 * i*i;h_b[i] = i;}//将host变量数组数据拷贝到Gpu设备指针中cudaMemcpy(d_a, h_a, N*sizeof(int), cudaMemcpyHostToDevice);cudaMemcpy(d_b, h_b, N * sizeof(int), cudaMemcpyHostToDevice);printf("Start Vector addition on GPU \n");//统计内核函数运行时间clock_t d_start = clock();//运行内核(设备)函数,配置内核参数:N个block, 每个block 1个线程GpuAdd << <N, 1 >> > (d_a, d_b, d_c);//等待所有内核函数执行完成后继续运行CPU主线程cudaThreadSynchronize();clock_t d_end = clock();double d_cost = (double) (d_end - d_start) / CLOCKS_PER_SEC;printf("End Vector addition on GPU \n");//记录CPU运行时间int h_c1[N];clock_t h_start = clock();CpuAdd(h_a, h_b, h_c1);clock_t h_end = clock();double h_cost = (double)(h_end - h_start) / CLOCKS_PER_SEC;//打印内核函数运行时间和CPU函数运行时间printf("No of Elements in Array:%d \n Device time %f seconds\n host time %f seconds\n\n",N, d_cost, h_cost);//将Gpu设备指针中数据拷贝到host变量数组中cudaMemcpy(h_c, d_c, N * sizeof(int), cudaMemcpyDeviceToHost);//在输出窗口打印结果/*for (int i = 0; i < N; i++){printf("The sum of %d element is %d + %d = %d \n", i, h_a[i], h_b[i], h_c[i]);}*///最后释放Gpu设备上分配的内存空间cudaFree(d_a);cudaFree(d_b);cudaFree(d_c);//system("pause");return 0;
}
2. 结果展示
从结果上看出,使用CUDA在Gpu设备上执行时间近花费了不到5s,而在CPU上执行却花费了55s, CUDA的并行运行能力还是很强大的。
总结
这里只是简单验证CUDA的并行处理能力,在CUDA内核参数配置时要尤其注意设备支持的block和每个block支持的线程数限制,否则程序会崩溃的,这也是本人在上述程序中设置宏定义N的值时验证过的。
学习资料
《基于GPU加速的计算机视觉编程》
VS2017 CUDA编程学习4:CUDA并行处理初探 - 向量加法实现相关推荐
- VS2017 CUDA编程学习8:线程同步-原子操作
文章目录 前言 1. 原子操作的理解 2. C++ CUDA实现原子操作 3. 执行结果 总结 学习资料 VS2017 CUDA编程学习1:CUDA编程两变量加法运算 VS2017 CUDA编程学习2 ...
- VS2017 CUDA编程学习11:CUDA性能测量
文章目录 前言 1. CUDA事件API 2. C++ 实现CUDA事件例子 3. CUDA事件例子的执行结果 4. NVIDIA Visual Profiler工具 总结 学习资料 VS2017 C ...
- VS2017 CUDA编程学习5:CUDA并行执行-线程
文章目录 前言 1. 线程 2. 代码实现 总结 学习资料 VS2017 CUDA编程学习1:CUDA编程两变量加法运算 VS2017 CUDA编程学习2:在GPU上执行线程 VS2017 CUDA编 ...
- CUDA 编程学习
0 简单的CUDA简介 1.简单教程 CUDA C ++只是使用CUDA创建大规模并行应用程序的方法之一.它允许您使用功能强大的C ++编程语言来开发由GPU上运行的数千个并行线程加速的高性能算法.许 ...
- CUDA编程学习3——并行计算初窥CUDA的软硬件架构
目录 并行计算概述 查看GPU相关信息 软硬件架构基础 物理层(物理结构) 逻辑层(kernel组织) 物理层和逻辑层的总结 参考 并行计算概述 所谓并行计算的概念定义 同时多个计算资源一起工作(逻辑 ...
- CUDA编程学习0——环境搭建环境详解
目录 环境配置 软件安装 1.支持最高的cuda版本查询,下载cuda开发软件: 3.配置环境(~/.bashrc添加环境变量) 4.后续维护查询 补:关于windows下的cuda环境配置 一.Vi ...
- Cuda编程学习(一)
使用Cuda进行GPU编程 --GPU高性能编程Cuda实战 第四章C并行编程总结 开始学习Cuda和GPU编程的相关知识啦. 感觉GPU编程会越来越重视,尤其是在移动端的计算复杂度优化方面.掌 ...
- cuda编程入门:使用cuda实现矩阵加法
使用cuda实现矩阵加法 1.整体流程 1.申请内存 2.转移拷贝 3.释放空间 4.核函数 2.头文件 关于cuda操作的一些接口都在这个头文件里 #include <cuda_runtime ...
- cuda C 编程权威指南 Grossman 第2章 CUDA编程模型
2.1 CUDA编程模型概述 CUDA编程模型提供了一个计算机架构抽象作为应用程序和其可用硬件之间的桥梁. 通信抽象是程序与编程模型实现之间的分界线,它通过专业的硬件原语和操作系统的编译器或库来实现. ...
最新文章
- 用python正确的获取文件最后被修改的时间
- Promise 的四种常用方法。
- mqtt消息队列安装并启用启用认证(客户端密码模式)
- git 存在多个commit 时将修改,追加到某次commit 上
- Python——类的实例
- 可见光通信原理及硬件方案
- 如何完成一款游戏? | 独立游戏制作
- 创意信件风格论文答辩PPT模板
- EasyClick 坐标拾取器
- HTML在线转换成PDF
- 基于Java swing的多人,图片,语音聊天室
- 故障恢复控制台主要命令
- 微信小程序获取手机号登录流程
- 黑马程序员武汉中心——程序员面试套路集
- 数据可视化之matplotlib实战:plt.step() 绘制阶梯图
- 前端开发和html5,Web前端和HTML5前端相同吗 有区别吗
- 掌控习惯读后感-詹姆斯·克利尔(James Clear)
- ESP32C3学习记录1——搭建开发环境
- 【历史上的今天】11 月 27 日:“数字女王”逝世;APL 语言发布;计算机先驱诞生日
- 去年日本国内汽车销售榜单公布