首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 如何比较CPU与GPU上程序执行时间? [已结帖,结帖人:MrSeacow]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • MrSeacow
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-04-12 16:12:42 楼主
    现在有一个并行算法,放在GPU上分成thread执行,可以用
    clock_t clock()函数,
    返回GPU上的clock cycle.

    这样的话,我如何将它与CPU上运行的串行算法比较呢?

    谢谢!
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • MrSeacow
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-12 16:20:591楼 得分:0
    另外,我知道可以用clock cycle除以时钟频率,然后和CPU的比较,
    但有没有更准确一些的方法?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • darkstorm2111203
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-12 22:24:022楼 得分:0
    gpu上不好监测,可以用cuda自带的time命令
    不过一样也测不准
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • coy_zhangce
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-14 13:29:323楼 得分:0
    如果在GPU算法开始时记录一次系统时钟,在GPU运行结束,数据读出后再记一次呢?要想直接测试GPU上用的运行时间好像确实很难。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • OpenHero
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-14 14:21:594楼 得分:0
    直接在GPU的函数内部执行clock 记时
    然后交换GPU信息到主机
    这样得到的时间会比较准确些
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • OpenHero
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-14 14:25:285楼 得分:0

    __global__ static void fun(/*.....*/ clock_t* time)
    {
    clock_t start = clock();

    /*.....*/

    *time = clock() - start;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • darkstorm2111203
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-14 17:37:446楼 得分:0
    unsigned int timer = 0;

        CUT_SAFE_CALL( cutCreateTimer( &timer));
        CUT_SAFE_CALL( cutStartTimer( timer));

    ...

        CUT_SAFE_CALL( cutStopTimer( timer));
        printf( "Processing time: %f (ms)\n", cutGetTimerValue( timer));
        CUT_SAFE_CALL( cutDeleteTimer( timer));

    cuda自带的,比clock()准一点点
    太小的时间片一样测不出来(最小单位在16ms左右,小于16ms的结果基本都可以认为不准)
    循环多次取平均可以得到比较准确的结果
    但是这样存在流水线预热,当问题规模较小时多次平均结果会比实际用时稍短
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • puppyli
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-14 20:04:547楼 得分:0
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • con_con
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-14 21:35:268楼 得分:0
    强人
    学习ing
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • boystones
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-14 21:36:099楼 得分:0
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kmlxk
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-14 23:00:5310楼 得分:0
    o.o 高科技!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hhl1234
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-14 23:33:3911楼 得分:0
    学习了啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hainanhlsc88
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-15 02:06:3712楼 得分:0
    该回复于2008-06-02 19:23:29被版主删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dxkh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-15 07:48:5313楼 得分:0
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lserlohn
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-15 08:56:1614楼 得分:0
    nVidia 好像放出过性能监控软件,但是仅支持一部分软件
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lavern
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-15 12:49:5715楼 得分:0
    高手~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • snake2
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-15 15:11:1216楼 得分:0
    。。。。。。。。。。。。。。。。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • MrSeacow
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-16 19:54:0917楼 得分:0
    5楼的OpenHero同学为什么又重复了一遍我的问题?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • MrSeacow
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-16 19:57:2318楼 得分:0
    14楼的lserlohn 同学说的是"CUDA Visual Profiler"吗?
    我试过,但这个好像和计算具体某个并行算法的总时间开销没有关系呀...或者也可以比较?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • OpenHero
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-17 10:12:1019楼 得分:0
    sorry 没看到你的第2楼的内容·
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • darkstorm2111203
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-17 11:53:0420楼 得分:10
    测比较小的时间好像一直有问题,比较典型的是矩阵乘法的例程
    把循环次数一次次的提高,会发现在循环次数为7-8的时候有一个几个数量级的跳变...
    我自己编写的一个循环程序也有一样的问题:
    循环没有用for,手动拷贝n遍...
    循环1到8次时,平均时间为0.03-0.05ms,据此估算循环10000遍应该是0.3-0.5秒的样子,但实际上用了1.2秒
    太小的时间片就是测不准,我在cudazone提过问好像也没有什么办法,只能循环多次取平均
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • darkstorm2111203
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-17 12:01:2321楼 得分:10
    比较的话,好像一般是要用加速比:并行算法时间/同样功能最快并行算法时间...
    不过现在要和cpu比,不知道是不是应该是 gpu并行算法时间()/最快cpu算法(可能是多线程的)时间
    其中gpu并行算法时间应不应该包括主存与显存的数据交换,要不要包括显存的读取与写入时间就要看具体情况了吧...
    这方面挺头痛的,数据交换时间常常占了gpu运算时间的大头...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Flyingfox23
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-17 12:44:5922楼 得分:0
    gpu和cpu有什么最大的区别之处呢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • darkstorm2111203
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-18 00:05:4623楼 得分:0
    更正下,不是毫秒是tick...
    gpu是牺牲分支预测需要的缓存,以数量取胜...上次有师兄问gpu是冯诺伊曼还是哈佛结构...还真不知道...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • MrSeacow
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-18 08:28:5724楼 得分:0
    谢谢!

    目前就先用加速比和手动多次重复好了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Promi
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 21:30:2425楼 得分:0
    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • denghui0815
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-23 19:28:3426楼 得分:0
    C/C++ code
    // 计时函数 __int64 XGetTickCount() { __int64 nTick = 0; #ifdef WIN32 static __int64 nFrequency = 0; if(nFrequency || QueryPerformanceFrequency((LARGE_INTEGER *)&nFrequency)) { QueryPerformanceCounter((LARGE_INTEGER *)&nTick); nTick = nTick * 1000000 / nFrequency; } #else struct timeval tmVal; struct timezone tmZone; gettimeofday( &tmVal, &tmZone ); nTick = (__int64)tmVal.tv_sec * 1000000 + tmVal.tv_usec; #endif return nTick; }


    微妙级别的计时函数
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jjqgpu
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-17 21:02:5327楼 得分:0
    强人
    学习ing
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • smallpluto
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-19 17:07:3928楼 得分:0
    我也有这个问题,在矩阵乘法运算时,加大矩阵的时候,处理时间几乎没有变化,有时还会减小
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • GoneWithPig
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-10 12:04:1129楼 得分:0
    引用 1 楼 MrSeacow 的回复:
    另外,我知道可以用clock cycle除以时钟频率,然后和CPU的比较,
    但有没有更准确一些的方法?


    用CUDA自带的event函数,SDK包里有详细的例子--syncAPI,cudavEventElapsedTime()的 精度
    可以达到0.5microseconds
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wchknudt
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2009-04-03 10:45:1730楼 得分:0
    我感觉没有光计算在GPU内部计算的时间没有太大意义,因为GPU是作为DEVICE或者说是Coprocessor存在的,应该把Memorycpy Host2GPU 和Memcpy GPU2HOST的时间都算上。再有就是精确到毫秒级别已经够了吧,用GPU不就是因为GPU可能带来一个甚至数个数量级的性能提升吗?
    修改 删除 举报 引用 回复