首页 > 其他分享 >基于CUDA的GPU计算PI值

基于CUDA的GPU计算PI值

时间:2023-05-03 22:33:44浏览次数:34  
标签:140 线程 CUDA GPU PI CPU block

访问【WRITE-BUG数字空间】_[内附完整源码和文档]

基于CUDA的GPU计算PI值。本项目使用CUDA编程模型并行计算PI值,研究GPU与CPU效率的比较,分析不同GPU线程分块对性能的影响。

异构计算试验报告

---实验1:基于CUDA的GPU计算PI值

第一部分:实验环境

OS:Windows 10

CPU:intel(R) Core(TM) i7-10510U CPU@mailto:CPU@ 1.80Ghz

GPU:NVIDIA GeForce MX250

编译器: cl :v19.29.30133

nvcc:Cuda compilationn tools, release 11.4, V11.4.120

第二部分:实验内容

使用 CUDA 编程模型并行计算 PI 值,研究 GPU 与 CPU 效率的比较,分析不同 GPU 线程分块对性能的影响

第三部分:实验原理

数学原理为

1 积分求解


基于CUDA的GPU计算PI值_并行计算

编辑切换为居中

添加图片注释,不超过 140 字(可选)


2 幂级数求解


基于CUDA的GPU计算PI值_分块_02

编辑切换为居中

添加图片注释,不超过 140 字(可选)


使用 CUDA 编程模型,程序执行过程为

CUDAMALLOC -> CUDAMEMCPY(HTOD) ->KERNEL->CUDAMEMCPY(DTOH)

在执行和函数时指定 <<<grid,block>>> 来控制线程的数量和结构

第四部分:性能分析

# define N 迭代次数

1 CPU VS GPU

1.1 单核比较

N = (10001000100)=100M

CPU(thread = 1):4.887(s)

GPU(grid = 1,block=1):用时过长..无法测量

1.2 多核比较

首先要发挥出最大的 CPU 性能,由于机器的 CPU 是逻辑 8 核的,所以理论上开启 8 个线程可以发挥最大性能。所以我写了一个 8 线程并行的程序来计算,同样循环 N=(10001000100)次


基于CUDA的GPU计算PI值_并行计算_03

编辑切换为居中

添加图片注释,不超过 140 字(可选)


可以看出新的时间为 0.768s 快了不少

(PS:这里的程序是使用 GCC 编译的,而 CUDA 程序 NVCC 调用的是 MSCV 的编译器,Windows 平台上 NVCC 不支持 GCC,但是结果应该是差不多的)

2 GPU 性能分析

接下来就是找出 GPU 的最高性能了。

首先在 grid = 1 下探究 block 里的线程数对性能的影响。这里可以直接用 nvprof 分析,非常方便。

2.1 grid = (1,1,1) block = (10,1,1)


基于CUDA的GPU计算PI值_CUDA_04

编辑切换为居中

添加图片注释,不超过 140 字(可选)


一共用时:34.5556s 线程数:10

可以注意到,在本程序中,主要的时间是消耗在计算上的,由于没有什么要拷贝的内存,所以瓶颈只会出现在计算上

2.2 grid=(1,1,1) block=(100,1,1)


基于CUDA的GPU计算PI值_并行计算_05

编辑切换为居中

添加图片注释,不超过 140 字(可选)


一共用时:2.58383s 线程数:100

2.3 grid=(1,1,1) block=(1000,1,1)


基于CUDA的GPU计算PI值_分块_06

编辑切换为居中

添加图片注释,不超过 140 字(可选)


一共用时:1.543s 线程数:1000

每个 block 的最大线程数限制是 1024,这里就不能再增加 block 了

基于CUDA的GPU计算PI值_并行计算_07

基于CUDA的GPU计算PI值_并行计算_08

基于CUDA的GPU计算PI值_分块_09

基于CUDA的GPU计算PI值_分块_10

标签:140,线程,CUDA,GPU,PI,CPU,block
From: https://blog.51cto.com/u_16075443/6241564

相关文章

  • Epic资源转到unity的方法
    众所周知,unity中的素材主要是通过unity资源商店获取的。但是unity资源商店的白嫖机会太少了,而隔壁UE的Epic资源商店就有每月免费的资源,不白嫖成何体统?但是UE咱也不会用啊,白嫖的资源也不能浪费掉啊。今天就给大家介绍Epic资源转unity的方法。1.下载UE和新建项目首先要下载Epic,然......
  • keil5 ARM Compiler5和6的优化等级以及对比
    keil5ARMCompiler5和6的优化等级以及对比 链接:ARMCompiler6优化等级_zhuimeng_ruili的博客-CSDN博客_armcompiler6链接:对keilMdk优化等级的理解_zhuimeng_ruili的博客-CSDN博客_mdk优化等级1、ARM Compiler6优化等级    -O0:没有优化,不推荐在ARMCompile......
  • 使用 Knife4j(Swagger)工具自动生成 API 接口文档
    现在的项目开发,绝大多数都已经采用前后端分离,前后端开发人员必须依靠接口文档进行协作。当前最流行的文档生成工具就是Swagger,它是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。但是本篇博客介绍的是Knife4j,它是集Swagger和OpenAPI为一体的......
  • about-keeping-pets
    关于养宠物Datetime:2023-05-03T20:04+08:00Categories:Essay这是一篇很久之前就想要写的东西,但是优先级不高所以一直放着,今晚看完了《忠犬八公》,是国内翻拍的(此篇文章不是影评)。小时候我很想养一只什么,可以是猫,也可以是狗,还可以是鸟,我还记得有一篇小学课文就是讲一个小孩想......
  • SpringBoot定义优雅全局统一Restful API 响应框架二
    这里解决之前留下来的问题,当程序没有正常返回时候就是程序由于运行时异常导致的结果,有些异常我们可,能无法提前预知,不能正常走到我们return的R对象返回。这个时候该如何处理在SpringBoot中,可以使用@ControllerAdvice注解来启用全局异常处理。通过使用@ControllerAdvice注解,可以捕......
  • linux设备树-基于pinctrl的LED字符设备驱动
    在前面我们已经介绍了pinctrlsubsystem相关的基础知识,这一节我们尝试修改设备树,在pincontrollernode下添加两个子节点分别用来控制LED1~LED4的全亮/全灭。然后我们编写LED驱动程序,配置LED的两种状态:default:默认状态,LED1~LED4全亮;myled-off:LED1~LED4全灭;一、修改设备树1.1......
  • 关于pandas.ExcelWriter()对象在执行.save()时报错FutureWarning: save is not part o
    有时使用pandas将多份数据,写入到Excel中不同的Sheet,可能会用到pandas.ExcelWriter("xxxx.xlsx")对象这样在结束时,就会对对象进行.save()和close(),当然这也是从大部分网站上看到的使用方法但是笔者在实际使用过程中,按这个过程,遇到报错:FutureWarning:saveisnotpartofthepu......
  • OpenAI API keys 的申请和测试小结
    申请准备工作,申请OpenAIAPIkeys首先需要准备三件套:1.VPN(登录Google和OpenAI)2.GoogleGmail邮箱账号3.国外手机(接收验证码,可用接码平台代替) 接下来,开启申请OpenAIAPIkeys之旅。 首先,开启VPN全局代理模式,同时将代理服务器的地址改为香港以外的国家,这样避免......
  • MFC-Pie绘制饼图
     HDChdc=::GetDC(m_hWnd);BOOLb=Pie(hdc,10,10,200,200,130,200,160,10);//绘制饼图/*参数1:HDC参数2和参数3:int限定矩形左上角坐标参数4和参数5:int限定矩形右下角坐标参数6和参数7:int起点坐标参数8和参数9:int终点坐......
  • cublas runtime error : the GPU program failed to execute 报错
    情景在使用pytorch1.0和RTX3060Laptop训练GIN的时候出现了这个错误原因pytorch1.0对应的cuda10.0版本太低了,不支持新的GPU架构解决最终使用了更新版本的pytorch......