最新要闻
- 快播:雷军运气爆棚:在小米手机官方活动 中奖一台小米13
- 世界资讯:小米音质最好智能音箱!小米Sound Pro开箱图赏
- 小米首款万兆路由发布:1799元
- 天天速递!只要699元!小米旗舰降噪耳机Buds 4发布:HiFi音质
- 小米8款新品价格汇总:3999元的小米13爱不爱?
- 全球新资讯:雷军:只有两家做双尺寸双高端 一家是苹果 一家是小米
- 小米13正式亮相:金属直边 继续对标iPhone!
- 今亮点!3999元起!小米13正式发布:黄金尺寸小屏、满血徕卡镜头
- 不涨价 小米13价格良心了:顶配12+512GB还便宜200元
- 全球微动态丨小米13 Pro正式亮相:中框仅仅3.2毫米!科技纳米皮手感无敌
- 全球信息:Intel显卡驱动即将大更新!DX9、DX11老游戏有惊喜
- 环球快资讯:MIUI 14“剃刀计划”砍向应用臃肿:微信文件重复存储问题终于解决
- 全球快看点丨全新界面 系统大幅精简!MIUI 14正式发布
- 环球快报:俞敏洪称不敢进高档美发店:一顿好酒肉没有了 心疼
- 当前热点-达尔文错了?螃蟹竟在地球上出现了5次
- 【天天聚看点】雷军晒小米13生产过程 由小米智能工厂全自动化装配
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
GPU CPU向量加法时间测试
GPU CPU向量加法时间测试
实验设备
系统:WSL Ubuntu18.04
(资料图)
实验思路
分别在GPU,CPU上测试两个一维向量的加法,CPU是一个个的串行计算相加,GPU可以通过并行的方式将对应位置的元素相加。
实验结果
但是实验结果分为两种,主要是由于不同的计时器导致的一些差异:
计时方式1:
计时方式2:
解释一些关键词,我们要测试的时间的分为四部分:
但是使用不同的计时器,会产生一些差异:一个是traditional timer
,还有一个是tutorial timer
,
这个教程里的意思是,给并行程序计时不能用传统的CPU计时方式traditional timer
:
clock_t start, finish;start = clock();// 要测试的部分finish = clock();duration = (double)(finish - start) / CLOCKS_PER_SEC;
而是改用如下的代码tutorial timer
:
所以GPU计算部分,使用作者提供的代码;而其它需要计时的部分,分别使用traditional timer
和tutorial timer
:
所以接下来的结果分为两种情况:
- 计时方式1
sum_tutorial_timer.cu
向量a,b的维度 | 262144\((512 \times 512)\) | 1048576\((1024 \times 1024)\) | 4194304\((2048 \times 2048)\) |
---|---|---|---|
实验结果截图 | |||
内存数据拷贝到GPU时间消耗 | 0.000754 sec | 0.001460 sec | 0.004343sec |
GPU计算时间 | 0.000021 sec | 0.000026 sec | 0.000028 sec |
结果从显存拷贝到内存时间消耗 | 0.000263sec | 0.000954 sec | 0.002438 sec |
显存计算总时间(上述相加) | 0.001038sec | 0.002440 sec | 0.006809 sec |
CPU 计算时间 | 0.000372 sec | 0.001884 sec | 0.006497 sec |
分析:
- 对比GPU和CPU的计算时间,随着数据维度增大,GPU计算时间没有明显的增大,CPU计算时间逐渐增大。
- 随着数据维度增大,数据在内存到显存双向拷贝时间逐渐增大。
- 显存计算总时间大于CPU计算时间,并没有使得向量加法的运行效率提高,这还有待研究。
计时方式2
sum_traditional_timer.cu
向量a,b的维度 262144\((512 \times 512)\) 1048576\((1024 \times 1024)\) 4194304\((2048 \times 2048)\) 实验结果截图 内存数据拷贝到GPU时间消耗 0.000392 sec 0.000826 sec 0.003920sec GPU计算时间 0.000030 sec 0.000022 sec 0.000031 sec 结果从显存拷贝到内存时间消耗 0.000414sec 0.000590 sec 0.002008 sec 显存计算总时间 0.000836 sec 0.001438 sec 0.003971 sec CPU 计算时间 0.000380 sec 0.001432 sec 0.005958 sec
- 使用
traditional timer
之后,可以发现数据拷贝的时间明显变短了。
实验代码
sum_tutorial_timer.cu
#include #include #include "freshman.h"// CPU 加法void sumArrays(float *a, float *b, float *res, const int size){ for (int i = 0; i < size; i += 1) { res[i] = a[i] + b[i]; }}// GPU 加法__global__ void sumArraysGPU(float *a, float *b, float *res, int N){ int i = blockIdx.x * blockDim.x + threadIdx.x; if (i < N) res[i] = a[i] + b[i];}int main(int argc, char **argv){ // set up device initDevice(0); int nElem = 512*512; // int nElem = 1024*1024; // int nElem = 2048*2048; printf("Vector size:%d\n", nElem); // 内存数据申请空间 int nByte = sizeof(float) * nElem; float *a_h = (float *)malloc(nByte); float *b_h = (float *)malloc(nByte); float *res_h = (float *)malloc(nByte); float *res_from_gpu_h = (float *)malloc(nByte); memset(res_h, 0, nByte); memset(res_from_gpu_h, 0, nByte); // 内存数据随机初始化 initialData(a_h, nElem); initialData(b_h, nElem); // 显存申请空间 float *a_d, *b_d, *res_d; CHECK(cudaMalloc((float **)&a_d, nByte)); CHECK(cudaMalloc((float **)&b_d, nByte)); CHECK(cudaMalloc((float **)&res_d, nByte)); // 内存到显存数据拷贝 double iStart, iElaps; iStart = cpuSecond(); CHECK(cudaMemcpy(a_d, a_h, nByte, cudaMemcpyHostToDevice)); CHECK(cudaMemcpy(b_d, b_h, nByte, cudaMemcpyHostToDevice)); iElaps = cpuSecond() - iStart; printf("内存数据拷贝到GPU时间消耗\t%f sec\n", iElaps); dim3 block(512); dim3 grid((nElem - 1) / block.x + 1); // GPU 加法 iStart = cpuSecond(); sumArraysGPU<<>>(a_d, b_d, res_d, nElem); iElaps = cpuSecond() - iStart; printf("GPU计算时间 \t\t\t\t %f sec\n", iElaps); //显存到内存数据拷贝 iStart = cpuSecond(); CHECK(cudaMemcpy(res_from_gpu_h, res_d, nByte, cudaMemcpyDeviceToHost)); iElaps = cpuSecond() - iStart; printf("结果从显存拷贝到内存时间消耗 %f sec\n", iElaps); // CPU 加法 iStart = cpuSecond(); sumArrays(a_h,b_h,res_h,nElem); iElaps= cpuSecond() - iStart; printf("CPU 计算时间\t\t\t\t %f sec\n", iElaps); checkResult(res_h, res_from_gpu_h, nElem); cudaFree(a_d); cudaFree(b_d); cudaFree(res_d); free(a_h); free(b_h); free(res_h); free(res_from_gpu_h); return 0;}
sum_traditional_timer.cu
#include #include #include #include "freshman.h"// CPU 加法void sumArrays(float *a, float *b, float *res, const int size){ for (int i = 0; i < size; i += 1) { res[i] = a[i] + b[i]; }}// GPU 加法__global__ void sumArraysGPU(float *a, float *b, float *res, int N){ int i = blockIdx.x * blockDim.x + threadIdx.x; if (i < N) res[i] = a[i] + b[i];}int main(int argc, char **argv){ // set up device initDevice(0); int nElem = 512*512; // int nElem = 1024*1024; // int nElem = 2048*2048; printf("Vector size:%d\n", nElem); // 内存数据申请空间 int nByte = sizeof(float) * nElem; float *a_h = (float *)malloc(nByte); float *b_h = (float *)malloc(nByte); float *res_h = (float *)malloc(nByte); float *res_from_gpu_h = (float *)malloc(nByte); memset(res_h, 0, nByte); memset(res_from_gpu_h, 0, nByte); // 内存数据随机初始化 initialData(a_h, nElem); initialData(b_h, nElem); // 显存申请空间 float *a_d, *b_d, *res_d; CHECK(cudaMalloc((float **)&a_d, nByte)); CHECK(cudaMalloc((float **)&b_d, nByte)); CHECK(cudaMalloc((float **)&res_d, nByte)); // 内存到显存数据拷贝 clock_t start, end; start = clock(); CHECK(cudaMemcpy(a_d, a_h, nByte, cudaMemcpyHostToDevice)); CHECK(cudaMemcpy(b_d, b_h, nByte, cudaMemcpyHostToDevice)); end = clock(); printf("内存数据拷贝到GPU时间消耗\t %f sec\n", (double)(end - start) / CLOCKS_PER_SEC); dim3 block(512); dim3 grid((nElem - 1) / block.x + 1); // GPU 加法 double iStart, iElaps; iStart = cpuSecond(); sumArraysGPU<<>>(a_d, b_d, res_d, nElem); iElaps = cpuSecond() - iStart; printf("GPU计算时间 \t\t\t\t %f sec\n", iElaps); //显存到内存数据拷贝 start = clock(); CHECK(cudaMemcpy(res_from_gpu_h, res_d, nByte, cudaMemcpyDeviceToHost)); end = clock(); printf("结果从显存拷贝到内存时间消耗\t %f sec\n", (double)(end - start) / CLOCKS_PER_SEC); // CPU 加法 start = clock(); sumArrays(a_h,b_h,res_h,nElem); end = clock(); printf("CPU 计算时间\t\t\t\t %f sec\n", (double)(end - start) / CLOCKS_PER_SEC); checkResult(res_h, res_from_gpu_h, nElem); cudaFree(a_d); cudaFree(b_d); cudaFree(res_d); free(a_h); free(b_h); free(res_h); free(res_from_gpu_h); return 0;}
freshman.h
#ifndef FRESHMAN_H#define FRESHMAN_H#define CHECK(call)\{\ const cudaError_t error=call;\ if(error!=cudaSuccess)\ {\ printf("ERROR: %s:%d,",__FILE__,__LINE__);\ printf("code:%d,reason:%s\n",error,cudaGetErrorString(error));\ exit(1);\ }\}#include #ifdef _WIN32#include #else#include #endif#ifdef _WIN32int gettimeofday(struct timeval *tp, void *tzp){ time_t clock; struct tm tm; SYSTEMTIME wtm; GetLocalTime(&wtm); tm.tm_year = wtm.wYear - 1900; tm.tm_mon = wtm.wMonth - 1; tm.tm_mday = wtm.wDay; tm.tm_hour = wtm.wHour; tm.tm_min = wtm.wMinute; tm.tm_sec = wtm.wSecond; tm. tm_isdst = -1; clock = mktime(&tm); tp->tv_sec = clock; tp->tv_usec = wtm.wMilliseconds * 1000; return (0);}#endifdouble cpuSecond(){ struct timeval tp; gettimeofday(&tp,NULL); return((double)tp.tv_sec+(double)tp.tv_usec*1e-6);}void initialData(float* ip,int size){ time_t t; srand((unsigned )time(&t)); for(int i=0;i:",ny,nx); for(int i=0;iepsilon) { printf("Results don\"t match!\n"); printf("%f(hostRef[%d] )!= %f(gpuRef[%d])\n",hostRef[i],i,gpuRef[i],i); return; } } printf("Check result success!\n");}#endif//FRESHMAN_H
实验总结
- 目前来看,数据从显存,内存来回复制的时间较长,是一个值得探究的问题。
- 不同的计时方式涉及一些底层原理,也需要去查阅资料。
- 之所以没有使用二维的图像数据,是因为二维数据还没来得及细想,所以假设把它拉平成一维再去做加法。
- GPU CPU向量加法时间测试
- 实验设备
- 实验思路
- 实验结果
- 实验代码
sum_tutorial_timer.cu
sum_traditional_timer.cu
freshman.h
- 实验总结
GPU CPU向量加法时间测试
快播:雷军运气爆棚:在小米手机官方活动 中奖一台小米13
世界资讯:小米音质最好智能音箱!小米Sound Pro开箱图赏
Windows OpenGL 图像透明度调节
焦点热文:异步批处理教程
小米首款万兆路由发布:1799元
天天速递!只要699元!小米旗舰降噪耳机Buds 4发布:HiFi音质
小米8款新品价格汇总:3999元的小米13爱不爱?
全球新资讯:雷军:只有两家做双尺寸双高端 一家是苹果 一家是小米
小米13正式亮相:金属直边 继续对标iPhone!
今亮点!3999元起!小米13正式发布:黄金尺寸小屏、满血徕卡镜头
不涨价 小米13价格良心了:顶配12+512GB还便宜200元
全球微动态丨小米13 Pro正式亮相:中框仅仅3.2毫米!科技纳米皮手感无敌
焦点消息!ELK+FileBeat日志分析系统
快看点丨差错控制
全球信息:Intel显卡驱动即将大更新!DX9、DX11老游戏有惊喜
环球快资讯:MIUI 14“剃刀计划”砍向应用臃肿:微信文件重复存储问题终于解决
全球快看点丨全新界面 系统大幅精简!MIUI 14正式发布
【世界聚看点】使webworker中支持使用import导入模块——threads.js
世界速看:说人话系列:DOM(Document Object Mode)究竟是怎么来的呢?
环球快报:俞敏洪称不敢进高档美发店:一顿好酒肉没有了 心疼
当前热点-达尔文错了?螃蟹竟在地球上出现了5次
全球新资讯:时间轮 (史上最全)
【天天聚看点】雷军晒小米13生产过程 由小米智能工厂全自动化装配
百事通!Intel独立显卡不做了?掌门人一句话 放心了!
长安深蓝SL03宣布涨价:预计上调2000元-8000元
环球快讯:沉船捞出165年前牛仔裤80万卖出:更有数不清的黄金
SpringMVC执行流程
全球快资讯丨任务调度系统-业务线资源隔离
天天微速讯:echarts设置暂无数据
老版本微博下线倒计时!新版已无法返回老版本
舒适降噪的天花板 索尼WH-1000XM5耳机跌破2000元
全球视点!苹果把果链撤出中国?难度可是地狱级的
天天滚动:SQLyog连接MYSQL时报错 Client does not support authentication protocol requested
世界快报:小米发布米家智能小厨宝7L S1:2000W速热、1年省电100度
播报:男子将手机改装成“偷拍神器”:摄像头改到耳机插孔 赚了30万
世界资讯:我迟早被这些AI绘画笑死
世界快报:买不到抗原检测试剂盒怎么办?不要慌
重点聚焦!Intel A750显卡新驱动性能实测:《CS:GO》帧数飙升79%
公众号附件怎么添加?还在用阅读原文的方式来添加吗,你已经落伍啦,现在大家都在用这个新方法,不仅方便还省事!
TabControl控件的简单使用-添加tab
【全球时快讯】Python爬虫实战,requests+xlwt模块,爬取螺蛳粉商品数据(附源码)
环球微速讯:Linux笔记03: Linux常用命令_3.3文件操作命令
新资讯:canvas分享
全球今头条!推特重推蓝V认证服务 苹果用户得多交3美元!马斯克也无能为力
每日焦点!三星S23 Ultra关键参数确定:首发高频版第二代骁龙8、祖传25W快充
童年记忆的黄桃罐头为啥突然火了?专家建议不要盲目囤
世界今头条!【2023最新B站评论爬虫】用python爬取上千条哔哩哔哩评论
【世界快播报】刘强东称新冠比感冒还轻微!王石也发声:只有鼻子不舒服 10天转阴
全球今亮点!再见C罗!C罗赛后痛哭:葡萄牙0-1摩洛哥 非洲球队首进4强
世界杯英法大战结束!法国2-1淘汰英格兰 晋级四强
中国市场已合资30年!又一车企资不抵债:销量暴跌
全球观速讯丨中国车企在俄罗斯销量飙升:市占率超1/3 主打中高端
每日消息!uniapp+unicloud开发微信小程序流程
焦点快看:清理备用内存 - 解决方案(备用内存占用过高且不自动释放)--九五小庞
天天日报丨Blazor和Vue对比学习(进阶.路由导航四):路由传参
王冰冰反向操作:戴摩洛哥围巾 希望葡萄牙获胜
今日看点:老黄怎么看?这张RTX 4090卖到了10万块 有钱也不一定买到:EVGA绝版货
东北市民网购宠物猪收到已冻僵 网友唏嘘:一个敢买一个敢发
【环球新要闻】从 695. 岛屿的最大面积 入手深度优先搜素DFS
快资讯丨用户重复注册分析-多线程事务中加锁引发的bug
【焦点热闻】PTA作业6-8电信系列总结
环球要闻:C#中的WebAPI
专为AR/VR打造!苹果全新操作系统名为xrOS:有专属应用商店 最早明年推出
全球看点:高校花2.4亿把教学课堂搬到了海上 网友羡慕不已
2022-6.824-Lab2:Raft
007爬虫之requests模块进阶
全球今日讯!攻防世界-unseping(序列化,Bash shell)
全球观速讯丨《暗黑破坏神4》赛季通行证需氪金购买 暴雪重申:不会充钱就变强
JavaScript:this指针
20点狂欢:淘宝每满200减30、天猫/京东每满300减40
厂家称黄桃罐头没药效 网友调侃:黄桃罐头为何成东北人疯狂膜拜的神物
全球看点:验证jenkins自动化部署
世界速读:首个进入太空的人类 宇航员加加林个人档案已解密:34岁死于空难
天天即时看!女生高铁录乐器考试被打断:工作人员知道情况后特意给换了地方
2021冬--简单描述时间复杂度
PDF转图片
Python实战案例,tkinter+random模块,实现课堂随机抽选提问并语音播报学生姓名
世界关注:将近30万人预约!有米粉要当小米13 Pro钉子户
每日观察!86寸4K巨屏!小米EA Pro 86电视今日开售 5999元
比Zen4还火 AMD游戏神U锐龙7 5800X3D史低2199元(首发3099)
MIUI 14花宠摆件上线!米粉:小时候的QQ农场又回来了
每日快报!刘强东分享抗新冠经验:比感冒还轻微 京东将开通热线帮助员工
Windows OpenGL ES 图像透明度
热门看点:我“采访”了 ChatGPT
观察:Blazor和Vue对比学习(进阶.路由导航二):布局(母版/嵌套)
世界简讯:WPF内嵌Http协议的Server端
造车大战中360赢麻了?周鸿祎大赞自己投资的哪吒汽车
天天快看:整活!MIUI 14桌面大变:支持图标自定义调整
当前速读:post表单数据格式完全解析multipart/form-data(C#实现)
队列之王: Disruptor 原理、架构、源码 一文穿透
每日视讯:Python如何导入自定义模块?
环球通讯!进制转换和计算机存储规则
SpringBoot整合Swagger2在线文档
迷惑!大妈凌晨骑车撞上路边停放车辆:怒斥司机不开车灯
黄桃罐头遭疯抢 厂家实诚回应“没药效” 网友调侃:你不懂
环球观焦点:曝Redmi K60系列依然将采用塑料支架 为了性价比?
注意!鲍鱼被列入濒危物种红色名录:20种或灭绝
10.3寸墨水屏!联想YOGA Paper墨水平板今日开售 3699元
天天热点评!环形队列、 条带环形队列 Striped-RingBuffer (史上最全)