cuda核函数运行时间计时--简单

**

CPU与GPU同步并行与异步并行

**并行与并发
并发:针对运行在单处理器上程序的性能
单CPU上,同一时刻只能有一个线程运行,即:把时间分成许多段,轮巡调用不同的线程,不断切换 ,让不同的线程运行;即为并发。微观上,不是同步执行的

就好像去吃流水席,一个人在某个时间只能吃到,上面漂下来的一小份菜,但是几道菜会穿插着漂下来,比如顺序是:糖醋排骨,辣子鸡,四喜丸子,炖猪蹄,
每次按着这个顺序往下流,每次的分量是一整盘菜的一点儿,那么整个流水席菜的顺序是:0.1份糖醋排骨,0.2份辣子鸡,0.1份四喜丸子,0.3份炖猪蹄; 0.2 糖醋排骨,0.3份辣子鸡,0.1份四喜丸子,0.1份炖猪蹄; ……

并行针对运行在多处理器上程序
多cpu上,同一时刻可以有多个线程运行;独立异步的速度执行,
使用多个线程,可以实现更高的吞吐量,处理器在等待一个线程的I/O时候,其他的线程也可以同步执行,单线程的话,就必须等待。

就好像,好多小兵在同时攻塔,各自攻击各自的,不用管别人咋样。

在执行某一个线程时,是否可以开启一个新的线程
同步达咩!!!
按着顺序执行,需要等待,协调运行
异步可以
彼此独立,处理器在等待A线程的I/O时候,其他的线程也可以执行,主线程不需要等待A线程的结束,再开其他的,可以就去干其他的

下面这个例子是借鉴别的博客的,链接在下面
比如:

同步,是所有的操作都做完,才返回给用户结果。即写完数据库之后,再响应用户,用户体验不好。
异步,不用等所有操作都做完,就相应用户请求。即先响应用户请求,然后慢慢去写数据库,用户体验较好。

https://kaven.blog.csdn.net/article/details/83384635?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_antiscanv2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_antiscanv2&utm_relevant_index=11

多线程可以实现异步,多线程不等于异步

cuda核函数计时

cuda里面的程序时异步执行的,cpu将命令写入缓存区,GPU读取命令启动核函数,执行任务,返回结果,cpu一般不会等待cuda函数结束会直接去做其他的事情。
一般GPU会给CPU汇报执行的进度,命令缓冲区和同步信息位置 位于,页锁定主机内存上,------------------CPU,GPU都可以在此处读取,“同步信息位置”,内存上有一个单调递增的整数值(“进度值”)GPU完成一条指令后,这个值就会更新这个值,CPU通过读取同步信息位置就可以得到GPU的工作进度。

cuda事件可以反映这种能力,其本质是GPU 的时间戳,可以在指定的时间点上记录,所以可以用来记录核函数的运行时间,因为位置是不固定的。

cudaEvent_t start, stop;//定义事件
for (qtime = 0; qtime < maxtime; qtime++) {
		cudaEventCreate(&start);//起始时间
		cudaEventCreate(&stop);//结束时间
		cudaEventRecord(start, 0);//记录起始时间
		Ez_update << <grid, block >> > (Ez, Hy, qtime);

		Hy_update << <grid, block >> > (Ez, Hy, qtime);
		cudaMemcpy(output, Ez, sizeof(double) * SIZE,    cudaMemcpyDeviceToHost);

		cudaEventRecord(stop, 0);//执行完代码,记录结束时间
		cudaEventSynchronize(stop);
		

		//printf("%lf\n", output[15]);
	}

	float elapsedTime;//计算总耗时,单位ms
	cudaEventElapsedTime(&elapsedTime, start, stop);
	printf("%f\n", elapsedTime);

但是cuda事件是在GPU上实现的,不适用于从同时包含设备代码和主机代码的混合代码情况。

参考文章
https://blog.csdn.net/weixin_37619439/article/details/90748088?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_paycolumn_v3&utm_relevant_index=10

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CUDA编程中,可以使用不同的方法来计算CUDA核函数的执行时间。其中一种方法是使用CPU计时器。这种方法使用一个CPU或GPU计时器来计算核函数的执行时间。具体来说,在主机端可以使用一个计时器来记录核函数的开始时间和结束时间。通过计算两个时间点之间的差值,可以得到核函数的执行时间。为了确保准确性,需要在核函数调用之后使用cudaDeviceSynchronize函数等待所有的GPU线程运行结束。这样可以确保计时器在核函数执行完毕后停止计时。然后,可以通过获取计时器的值并计算时间差来获得核函数的执行时间。 另一种方法是使用CUDA事件来计算核函数的执行时间。CUDA事件是GPU的时间戳,可以在指定的时间点上记录。通过在核函数执行前创建一个起始事件,并在核函数执行后创建一个结束事件,然后通过计算两个事件之间的时间差来获得核函数的执行时间。具体的实现可以参考以下代码片段: ```c cudaEvent_t start, stop; // 定义事件 cudaEventCreate(&start); // 创建起始事件 cudaEventCreate(&stop); // 创建结束事件 cudaEventRecord(start, 0); // 记录起始时间 // 执行核函数 kernel<<<grid, block>>>(...); cudaEventRecord(stop, 0); // 记录结束时间 cudaEventSynchronize(stop); // 等待事件完成 float elapsedTime; // 计算总耗时,单位以毫秒为单位 cudaEventElapsedTime(&elapsedTime, start, stop); ``` 通过上述方法,可以得到核函数的执行时间elapsedTime,单位以毫秒为单位。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [《CUDA C编程权威指南》——2.2 给核函数计时](https://blog.csdn.net/weixin_33831196/article/details/90534666)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [cuda核函数运行时间计时--简单](https://blog.csdn.net/qq_43594926/article/details/123847389)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值