• CUDA使用Event进行程序计时


    GPGPU是众核设备,包含大量的计算单元,实现超高速的并行。

    使用CUDA在nvidia显卡上面编程时,可以使用CUDA提供的Event进行程序计时。

    当然,每种编程语言基本都提供了获取系统时间的函数,如C/C++/Java 程序计时功能函数

    Event可以统计GPU上面某一个任务或者代码段的精确运行时间。

    如下面的程序实例(CalTime.cu):

     1 #include<stdio.h>
     2 #include<cuda_runtime.h>
     3 
     4 //__global__声明的函数,告诉编译器这段代码交由CPU调用,由GPU执行
     5 __global__ void mul(int *dev_a,const int NUM)
     6 {
     7     int idx = blockIdx.x * blockDim.x + threadIdx.x;
     8     int dis=blockDim.x * gridDim.x;
     9     while(idx<NUM)
    10     {
    11         dev_a[idx]=dev_a[idx]%23*dev_a[idx]*5%9;
    12         idx+=dis;
    13     }
    14 }
    15 
    16 int main(void)
    17 {
    18     const int thread_pre_block = 64;    //每个block的线程数量
    19     const int block_pre_grid = 8;    //grid中的block数量
    20     const int NUM = 45056;
    21 
    22     //申请主机内存,并进行初始化
    23     int host_a[NUM];
    24     for(int i=0;i<NUM;i++)
    25         host_a[i]=i;
    26 
    27     //定义cudaError,默认为cudaSuccess(0)
    28     cudaError_t err = cudaSuccess;
    29 
    30     //申请GPU存储空间
    31     int *dev_a;
    32     err=cudaMalloc((void **)&dev_a, sizeof(int)*NUM);
    33     if(err!=cudaSuccess)
    34     {
    35         perror("the cudaMalloc on GPU is failed");
    36         return 1;
    37     }
    38 
    39     //将要计算的数据使用cudaMemcpy传送到GPU
    40     cudaMemcpy(dev_a,host_a,sizeof(host_a),cudaMemcpyHostToDevice);
    41 
    42     dim3 threads = dim3(thread_pre_block);
    43     dim3 blocks  = dim3(block_pre_grid);
    44 
    45     //使用event计算时间
    46     float time_elapsed=0;
    47     cudaEvent_t start,stop;
    48     cudaEventCreate(&start);    //创建Event
    49     cudaEventCreate(&stop);
    50 
    51     cudaEventRecord( start,0);    //记录当前时间
    52     mul<<<blocks, threads, 0, 0>>>(dev_a,NUM);
    53     cudaEventRecord( stop,0);    //记录当前时间
    54 
    55     cudaEventSynchronize(start);    //Waits for an event to complete.
    56     cudaEventSynchronize(stop);    //Waits for an event to complete.Record之前的任务
    57     cudaEventElapsedTime(&time_elapsed,start,stop);    //计算时间差
    58 
    59     cudaMemcpy(&host_a,dev_a,sizeof(host_a),cudaMemcpyDeviceToHost);    //计算结果回传到CPU
    60 
    61     cudaEventDestroy(start);    //destory the event
    62     cudaEventDestroy(stop);
    63     cudaFree(dev_a);//释放GPU内存
    64     printf("执行时间:%f(ms)
    ",time_elapsed);
    65     return 0 ;
    66 }

    编译执行代码:

      

  • 相关阅读:
    Android ActivityGroup的使用代码将子activty 的layout加入到主activity中
    ERROR: Application requires API version 10. Device API version is 8
    简单实现Android实现九宫格
    继承中new 与 override的作用
    Sql server 数量累计求和
    Android 应用程序窗体显示状态操作(requestWindowFeature()的应用)
    UDP传输错误 无法找到程序集“client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
    堆与栈的区别
    Decorator模式
    时间为O(1)删除节点的代码
  • 原文地址:https://www.cnblogs.com/xudong-bupt/p/3512542.html
Copyright © 2020-2023  润新知