cuda 核函数 for循环_【CUDA 基础】6.4 重叠GPU和CPU的执行

本文详细介绍了如何实现GPU和CPU的执行重叠,通过将内核调度到不同流并在CPU等待GPU事件时进行计算,达到并行效果。提供了具体的代码示例,并强调了使用非阻塞事件的关键性。
摘要由CSDN通过智能技术生成

de0cd01871ab79fbdee9b89ec4403524.png

Abstract: 本文介绍如何进行GPU和CPU的重叠执行Keywords: 重叠GPU和CPU的执行

重叠GPU和CPU的执行

除了上文说到的重叠数据传输和核函数的同时执行,另一个最主要的问题就是使用GPU的同时CPU也进行计算,这就是我们本文关注的重点。
本文示例过程如下:
- 内核调度到各自的流中
- CPU在等待事件的同时进行计算

具体代码如下:

cudaEvent_t start,stop;
    cudaEventCreate(&start);
    cudaEventCreate(&stop);
    cudaEventRecord(start,0);
    for(int i=0;i<N_SEGMENT;i++)
    {
        int ioffset=i*iElem;
        CHECK(cudaMemcpyAsync(&a_d[ioffset],&a_h[ioffset],nByte/N_SEGMENT,cudaMemcpyHostToDevice,stream[i]));
        CHECK(cudaMemcpyAsync(&b_d[ioffset],&b_h[ioffset],nByte/N_SEGMENT,cudaMemcpyHostToDevice,stream[i]));
        sumArraysGPU<<<grid,block,0,stream[i]>>>(&a_d[ioffset],&b_d[ioffset],&res_d[ioffset],iElem);
        CHECK(cudaMemcpyAsync(&res_from_gpu_h[ioffset],&res_d[ioffset],nByte/N_SEGMENT,cudaMemcpyDeviceToHost,stream[i]));
    }
    //timer
    CHECK(cudaEventRecord(stop, 0));
    int counter=0;
    while (cudaEventQuery(stop)==cudaErrorNotReady)
    {
        counter++;
    }
    printf("cpu counter:%dn",counter);

本文完整的代码在github:https://github.com/Tony-Tan/CUDA_Freshman(欢迎随手star )
运行结果是:

82c9d59cc5de6927156d5096422726b2.png

可见在事件stop执行之前,CPU是一直在工作的,这就达到一种并行的效果
代码中关键的一点是

cudaEventQuery(stop)

是非阻塞的,否则,不能继续cpu的计算

总结

本文很短,但是,作为一个非常不错的例子,展示了GPU和CPU之间的并行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值