**
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