CUDA: (六) 时间计算、CUDA stream(CUDA 流)

您所在的位置:网站首页 新增疑似病例怎么计算出来的 CUDA: (六) 时间计算、CUDA stream(CUDA 流)

CUDA: (六) 时间计算、CUDA stream(CUDA 流)

2024-07-07 23:47| 来源: 网络整理| 查看: 265

CUDA时间评估

LZ之前都是使用CPU timer来评估CUDA代码的性能的,但是这样做时候没有办法给出精确答案的,除了其他因素外,最常见的时间计算误差包括线程延迟开销和操作系统调度的开销。同时,使用GPU测量的时间还取决于高精度Cpu计时器的可用性。在很多情况下,主机在GPU内核运行时执行异步计算,因此,因此为了测量GPU内核消耗的时间,CUDA提供了对应于event的API。

CUDA event是在CUDA程序中指定位置记录GPU的时间戳,在这个API中,GPU记录了对应的时间戳,消除了上面提到的两个问题。

使用CUDA event有两个测量时间的步骤:创建事件和记录事件,最后计算中间的时间,得到最后代码的整体性能。

具体的代码块如下所示

#include #include int main(){ // 一些数据准备 ... ... // 实例化CUDA event cudaEvent_t e_start, e_stop; //创建事件 cudaEventCreate(&e_start); cudaEventCreate(&e_stop); //记录事件,开始计算时间 cudaEventRecord(e_start, 0); ... //一顿操作猛如虎 ... //记录结束时事件 cudaEventRecord(e_stop, 0);// 0 代表CUDA流0 //等待事件同步后 cudaEventSynchronize(e_stop); //计算对应的时间,评估代码性能 float elapsedTime; cudaEventElapsedTime(&elapsedTime, e_start, e_stop); } CUDA stream(CUDA 流)的一些理解

使用多个block或者thread,只是把一个任务进行并行化操作,但是并没有体现任务的并行性。任务的并行性是指可以运行多个核函数,最常见的如图像处理可以一个流做图像上下翻转,一个流做随机crop,还可以一个流做resize但是这个并不是那么灵活。

CUDA流其实是在GPU执行中GPU操作队列具体顺序。这些功能包括内核功能,内存复制操作和CUDA事件操作,而这些操作添加队列的顺序其实就是对应操作执行的顺序。每个CUDA流可以看做一个单独的任务,所以我们可以使用多个流来开启多个任务。

#include #include #include #define RANDOM(x) (rand() % x) #define MAX 10 #define M 128 // number of thread #define N 50000 // Define number of elements in Array //Define kernel function for vector addition __global__ void gpuAdd(int *d_a, int *d_b, int *d_c){ // getting block index of current kernel int tid = threadIdx.x + blockIdx.x *blockDim.x; while(tid


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3