找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 363|回复: 8

求问使用cudaEvent测GPU时间显示为0的问题?

[复制链接]
发表于 2018-2-2 14:56:27 | 显示全部楼层 |阅读模式
ESC4000G3
我想要测试矩阵转置与FFT的执行时间,都使用的CUBLAS和CUFFT的接口,并未自己写内核函数,并且所有包括cudamalloc,cudamemcpy,以及cublas cufft的接口都进行了检查,返回值都是0表示成功,但是用cudaEvent来测试转置与FFT总共耗费的时间的时候却显示为0。请问是为什么呢?    GPU是 tegra x1。原生编译,直接用的GEDIT和CMAKE
回复

使用道具 举报

发表于 2018-2-5 18:44:45 | 显示全部楼层
Jetson TX2
你好是否方便看下你的代码
回复 支持 反对

使用道具 举报

发表于 2018-2-5 20:27:38 | 显示全部楼层
Tesla P100
大家讨论的结果也是觉得楼主代码有问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-6 12:31:07 | 显示全部楼层
代码如下,我是直接写在一个函数里面,然后主函数直接调用这个接口:
extern "C" int FFTtest()

{

        int rows=32;
       
        int cols=512;
       
        float2* a=new float2[rows*cols];
       
       
        for(int i=0;i<rows*cols;i++)
       
        {
               
                a[i].x=(float)(rand()%1024);
               
                a[i].y=(float)0.0f;
       
        }
       
       
        printf("%f\n",a[1000].x);

       
        float2* dev_input;
       
        float2* dev_temp;
       
        float2* dev_output;


       
        cudaMalloc((void**)&dev_input,rows*cols*sizeof(float2));
       
        cudaMalloc((void**)&dev_temp,rows*cols*sizeof(float2));
       
        cudaMalloc((void**)&dev_output,rows*cols*sizeof(float2));

       
       
        cublasStatus_t firstTranse;
       
        cublasStatus_t secondTranse;

       
        cublasHandle_t transeHandle;
       
        cublasCreate(&transeHandle);
       
       
        cufftResult_t fftResult;
       
        cufftHandle plan;
       
        fftResult=cufftPlan1d(&plan,rows,CUFFT_C2C,cols);
       
        printf("fft plan:%d\n",fftResult);

       
        cudaMemcpy(dev_input,a,rows*cols*sizeof(float2),cudaMemcpyHostToDevice);

               
        float2 Alpha;
       
        Alpha.x=1.0f;
       
        Alpha.y=0.0f;
       
        float2 Beta;
       
        Beta.x=0.0f;
       
        Beta.y=0.0f;

       

        cudaEvent_t start1,stop1;
       
        cudaEventCreate(&start1);
       
        cudaEventCreate(&stop1);
       
        cudaEventRecord(start1,0);


       
        firstTranse=cublasCgeam(transeHandle,CUBLAS_OP_T,CUBLAS_OP_N,rows,cols,
        &Alpha,dev_input,cols,
        &Beta,dev_input,rows,
        dev_temp,rows);
       
        //printf("first transe:%d\n",firstTranse);

       
        fftResult=cufftExecC2C(plan,dev_temp,dev_temp,CUFFT_FORWARD);
       
        //printf("fft:%d\n",fftResult);

       
        secondTranse=cublasCgeam(transeHandle,CUBLAS_OP_T,CUBLAS_OP_N,cols,rows,
        &Alpha,dev_temp,rows,
        &Beta,dev_temp,cols,
        dev_output,cols);
       
        //printf("second transe:%d\n",secondTranse);

       

        cudaEventRecord(stop1,0);
       
        float costtime;
       
        cudaEventElapsedTime(&costtime,start1,stop1);
       


       
        float2* host_out=new float2[rows*cols];
       
        cudaMemcpy(host_out,dev_output,rows*cols*sizeof(float2),cudaMemcpyDeviceToHost);
       

       
        printf("%f\n",host_out[20].x);

       
        printf("time of GPU: %f ms\n",costtime);

       

        delete []host_out;
       
        delete []a;
       
        cudaFree(dev_input);
       
        cudaFree(dev_temp);
       
        cudaFree(dev_output);
       
        cufftDestroy(plan);
       
        return 0;







}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-6 12:31:46 | 显示全部楼层
sisiy 发表于 2018-2-5 20:27
大家讨论的结果也是觉得楼主代码有问题

你好,已经把代码上传,麻烦您帮我指点一下,谢谢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-6 12:32:01 | 显示全部楼层
SIRJIANGJUN 发表于 2018-2-5 18:44
你好是否方便看下你的代码

版主您好,代码已上传
回复 支持 反对

使用道具 举报

发表于 2018-2-8 11:51:02 | 显示全部楼层
在计算时间差前添加cudaEventSynchronize试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-1 14:09:31 | 显示全部楼层
SIRJIANGJUN 发表于 2018-2-8 11:51
在计算时间差前添加cudaEventSynchronize试试

感谢版主,过春节没有看帖子,感谢感谢,问题已经解决了哈!   请问这是为什么呢?为什么需要同步一下
回复 支持 反对

使用道具 举报

发表于 2018-3-2 14:44:30 | 显示全部楼层
因为是异步处理的 所以你要等待所有任务完成 才能合理的计时
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

快速回复 返回顶部 返回列表