我想做一个矩阵相乘的实验
现在实验的cpu 上完成 矩阵乘法(然后再用cuda gpu上实现)
然后计时
但是发现 在release 之后,发现每次的时间都不一样。 不知道这是怎么回事。请大家帮我看一下。
#include “cuda_runtime.h”
#include “device_launch_parameters.h”
#include <stdio.h>
#include <stdio.h>
#include <time.h>
void randomInit(float* data, int size)
{
for (int i = 0; i < size; ++i)
{
data[i] = rand() / (float)RAND_MAX;
}
}
int main()
{
clock_t start=0;
clock_t finish=0;//测时
double duration=0;
int wA=500;
int hA=500;
int wB=500;
floatA=(float)malloc(sizeof(float)wAhA);
randomInit(A, wAhA);
floatB=(float*)malloc(sizeof(float)wBwA);
randomInit(B, wB*wA);
start = clock();
float C=(float)malloc(sizeof(float)hAwB);
for (int i=0;i< hA; ++i)
{
for(int j=0;j< wB; ++j)
{
double sum=0;
for(int k=0;k<wA; ++k)
{
double a=A[i*wA+k];
double b=B[kwB+j];
sum+=ab;
}
C[i*wB+j]=sum;
//printf(" %f \n", C);
}
}
finish = clock();
printf(" %ld \n", start);
printf(" %ld \n", finish);
duration = (double)(finish - start)*1000 / CLOCKS_PER_SEC;
printf(" %f \n", duration);
return 0;
}
[attach]3302[/attach]
[attach]3303[/attach][attach]3304[/attach]
发现两次的时间不一致。
LZ您好:
简单地说,推荐使用visual profiler来测试您kernel的时间,这样您无需改动您的代码,加入各种计时的命令。
以及,第一次运行kernel可能会因为各种环境初始化的因素而比较慢,您可以从第二次开始,取几次求平均值。以及从第二次开始,运行的时间可能还会有轻微的波动,这个也是正常的现象。
大致如此,祝您编码顺利~
实际上多次结果也不一样。
我看了一些资料,
是不是我的精度的问题,那个好像 也要 用一个 程序搞定,提高精度
再次感谢版主长期的帮助,有的问题,可能不是符合版规,希望版主谅解,我下次一定注意。
LZ您好:
1:您说的多次运行事件结果不一致,请问是CPU计算部分计时不一致还是GPU部分?您上述代码中仅对CPU计算进行了计时,没见到您GPU部分。
2:请您参阅一下此链接的讨论:
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6613&extra=&page=1
祝您编码顺利~
版主,是这样的,我这个是cpu部分的
实际上gpu部分,我也 编写了,不过是根据cuda sample 编写的,
时间也是不一致的,
稍后我回上传一下,
谢谢版主,
真不知道怎么感谢您好了。
LZ您好:
您客气了,欢迎您继续补充您的代码和其他具体信息。
以及,本帖回答我以搬运为主,请感谢原创作者横扫斑竹~
祝您编码顺利~
我建议您在要求ICE帮助您诊断“计时”的问题之前,
建议您先将kernel和代码调试正确,再考虑测试。(您可以对调试kernel新开主题)。
您觉得呢?
system
11
前面的cpu 计时,
和gpu 计时
程序都能正常运行。。
那我继续修改(只是后面的cublas 的库 加上之后,出现了问题),
然后再提问题把,
谢谢版主。
system
14
[attach]3306[/attach]
结果是这个,第一个时间是gpu的运行时间,
第二个时间是cpu 的时间
觉得cuda 5.0 好像也不是很稳定,
同样的一段程序,, 在debug模式下,有错误
但是在release 模式下 没有错误
也可能是我自己程序写的问题,
再次感谢版主 ICE 以及横扫千军
system
15
对您的多个建议您依然无视:
(1)不要使用clock()对kernel计时。您依然使用了。
(2)请先确定贵kernel正确执行了再考虑“测时“的问题。
(3)如果真的要用clock()(仅在windows下有效), 请考虑连续<<<<>>> 30次后,再一次cudaDeviceSynchronize(), 而不是每次都同步。
以及,您的kernel是否成功执行了,请先确定这点(您可以检查cudaDeviceSynchronize()的返回值),然后再请考虑上3个建议。
一意孤行对您严重不利!!请考虑!!!
system
16
程序 是基于cuda 给的历程修改的
gpu那段还是根据shared memory 写的
最近才理解shared memory 的那个用法。
不过shared memory 后面的register 来做矩阵乘法的那个程序我并没有看懂,这几天要继续学习,希望和大家一起探讨。
我觉得那个register 的矩阵乘法,好像是把for循环分开写,同时用多个线程来完成for循环的任务。
system
17
。。。。不能再说什么了。这本来就是ICE的帖子。
我将在7d内保持对您的无视状态。(既然您连续无视我)。
system
18
版主,
不好意思,
您说的,那个帖子我看到了。
只是我刚才在调试程序的时候,
cudaEvent 函数,我调 了半天, 也没调通。
所以最后没办法,才用的clock函数,
后来发现是 其中的一个 语句写错了,
稍后我会修改这段代码,
改为cudaEvent 计时,
感谢版主的建议,我会斟酌这里面的 kernel 的用法,
才学了cuda 20 天左右,
算上看书,配置系统,
这里会记住版主的建议,
谢谢版主
注意休息,已经很晚了。
system
19
LZ您好:
您学习CUDA时间的长短与本主题讨论内容无关的,不能因为这个因素就无视横扫斑竹的正确建议,请您仔细考虑横扫斑竹上面的各个回帖,这是您快速获得可靠经验的宝贵途径。
以及:
1:kernel测时请考虑跑profiler或者自行使用event测时,注意避开第一次的程序热身。
2:请保证您的代码能正确执行(包括语法上和逻辑上)之后,再考虑测时和优化问题。先正确执行,再考虑优化,这是一个基本原则。
3:您可以将各个不同的方法分别实现并调试,避免写到一起增加复杂度。
4:您16#提出的某新的实现请随后具体问题具体分析。
在您保证您的程序实现正确+测时正确+提供必要的信息之前,无法对您的测试结果作出评价,敬请谅解。
祝您编码顺利~