社区
CUDA on Linux
帖子详情
CUDA下,如何测试1MB的数据从主机内存传输到gpu全局内存花费的时间?
MrCzx
2017-12-02 11:20:10
我是这样测试,在主机内存申请一个数据,数组的大小为256,然后给其赋初始值,然后用cudaMemcpy函数拷贝,用time.h头文件里面获取时间,但是在cudaMemcpy前后获取的时间一致,这是因为什么原因呢?求助,应该有啥好的方法测试所花费的时间?
...全文
837
3
打赏
收藏
CUDA下,如何测试1MB的数据从主机内存传输到gpu全局内存花费的时间?
我是这样测试,在主机内存申请一个数据,数组的大小为256,然后给其赋初始值,然后用cudaMemcpy函数拷贝,用time.h头文件里面获取时间,但是在cudaMemcpy前后获取的时间一致,这是因为什么原因呢?求助,应该有啥好的方法测试所花费的时间?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
YCMyTot
2018-05-25
打赏
举报
回复
2楼正解,1MB的数据确实不大,精度低的话,根本测不出来,可以试下把数据量调大或者使用us级来计算时间。此外gpu端计算时间可以用cudaevent_t。 这样测试感觉意义不大。。。
tfwn
2018-05-17
打赏
举报
回复
秒级精度太低了,至少使用us级吧 随便找了个测例如下: #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { clock_t begin, end; double cost; //开始记录 begin = clock(); /*待测试程序段*/ printf("hello world!\n"); //结束记录 end = clock(); cost = (double)(end - begin)/CLOCKS_PER_SEC; printf("constant CLOCKS_PER_SEC is: %ld, time cost is: %lf secs", CLOCKS_PER_SEC, cost); }
MrCzx
2017-12-02
打赏
举报
回复
#include <stdio.h> #include <time.h> #define size 256000 int main(){ time_t start,finish; struct tm *startsm,*finishsm; int ah[size],bh[size],i; bool flag=1; //用来判断传输过程中是否出现错误,1无误,0错误 int *ad; for(i=0;i<size;i++){ ah[i]=i; } cudaSetDevice(0); cudaMalloc((void**)&ad, size*sizeof(int)); //1KB数据从cpu内存到GPU内存 start=time(NULL); //计时开始 startsm=localtime(&start); printf("start :%ld\n",start); printf("-----%s",asctime(startsm)); cudaMemcpy(ad, ah, size*sizeof(int), cudaMemcpyHostToDevice); finish=time(NULL); //结束计时 finishsm=localtime(&finish); printf("finish: %d\n",finish); printf("-----%s",asctime(finishsm)); printf("%dKB数据从cpu内存到GPU内存所花费的时间为:%f s\n",size/256,difftime(finish,start)); //数据从gpu内存到cpu内存 time(&start); //计时开始 cudaMemcpy(bh, ad, size*sizeof(int), cudaMemcpyDeviceToHost); time(&finish); //结束计时 printf("%dKB数据从gpu内存到cpu内存所花费的时间为:%f s\n",size/256,difftime(finish,start)); //检查是否有错误 for(i=0;i<size;i++){ //printf("%d ",bh[i]); if(ah[i]!=bh[i]){ flag=0; break; } } if(flag){ printf("corret:传输过程无误\n"); } else{ printf("wrong:传输过程出错,需要进一步检查\n"); } cudaFree(ad); return 0; }
什么让
CUDA
程序性能大幅提升?
GPU
寄存器与固定
内存
的秘密大公开
你是不是也遇到过这样的情况:辛辛苦苦写了个
CUDA
程序,结果跑起来慢得像乌龟爬,性能完全不如预期?这篇文章不玩虚的,直接用大白话和硬核代码,教你如何快速上手这些知识点,提升程序效率。别怕试错,动手写代码,跑
数据
,调参数,总能找到属于你的性能巅峰。
GPU
寄存器是每个线程的“私人宝库”,速度快得飞起,比
全局
内存
快几十倍。:寄存器是
CUDA
的命脉,但别一味追求少用。**改成这样:告诉编译器这些指针不重叠,减少不必要的
内存
检查,寄存器分配更高效。:固定
内存
不是万能药,小
数据
用它是大杀器,大
数据
就别硬上,浪费资源。
第6章
CUDA
内存
处理 摘录
6.1 简介 抽象已经在现代程序语言中成为一种趋势。它使程序员离底层硬件越来越大,以确保程序员不必过多了解底层硬件就可以编写程序。但它仍然灵活的编译器将上层的抽象转换成底层硬件能够理解的形式。 有两个比较重要的概念,一个是存储带宽(memeory bandwidth),即在一定
时间
内从DRAM中读出或写入的
数据
量。一个是延迟(latency),即响应一个获取
内存
的请求所
花费
的
时间
,通常这个
时间
会是上百个处理器周期。 从
内存
总线带宽与
内存
设备时钟频率的角度来看,处理器的设计也出现了相同的权衡点。设备上硅
第9章 应用程序性能优化(2) 摘录
9.3 策略:
传输
9.3.1 锁页
内存
为对某一
数据
集进行操作,你需要将
数据
从
主机
传输
到设备上、在
数据
集是哪个进行操作,然后将结果
传输
回
主机
。由于是在完全串行的方式下执行的,这将导致
主机
和
GPU
在一段
时间
内实现制的,白白浪费了
传输
能力与计算能力。 在本章,我们详细介绍了多
GPU
的使用,包括如何使用流以确保
GPU
总是有工作可做。使用简单的双缓冲技术,尽管
GPU
正在将结果
传输
回
主机
并且请求一个新的工作包,但另一个缓冲仍然能被计算引擎来处理下一个
数据
块。
主机
处理器支持虚拟
内存
系统,其中物理
内存
页可以
CUDA
统一
内存
的技术内幕
原文 我之前的介绍性文章“
CUDA
C++更简单的介绍”介绍了
CUDA
编程的基础,展示了如何编写一个简单的程序,将两个数组的数字分配给
GPU
可访问的
内存
,然后在
GPU
上把它们相加起来。为此,我向您介绍了统一
内存
,它使分配和访问
数据
变得非常容易,这些
数据
可以由系统中任何处理器(CPU或
GPU
)上运行的代码使用。 图1所示。统一
内存
是系统中任何处理器都可以访问的单个
内存
地址空间。 我用...
【
GPU
高性能编程
CUDA
实战】学习笔记
【
GPU
高性能编程
CUDA
实战】学习笔记,
GPU
编程入门,可以采用这本书,首先知道它大概有哪些东西,然后在工作中,任务驱动去学习
GPU
的其他知识,实践实践再实践。
CUDA on Linux
374
社区成员
345
社区内容
发帖
与我相关
我的任务
CUDA on Linux
CUDA on Linux
复制链接
扫一扫
分享
社区描述
CUDA on Linux
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章