【问题标题】:Why can't I use gpu to reduce the cpu occupancy rate?为什么不能用gpu来降低cpu占用率?
【发布时间】:2015-07-01 03:01:02
【问题描述】:

cuda cpu function - gpu kernel overlap,我知道如何同时执行gpu和cpu功能。但是这里有另一种情况,gpu和cpu函数必须串行执行,问题是当cpu被gpu内核执行阻塞时,cpu进程会挂起吗?如果是的话,cpu的占用率应该很低吧?

下面是我的cuda代码,很简单,仅供测试

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>

__global__ void kernel(float *d_data)
{
    //dead loop
    while(1)
    {
        *d_data = -1;
        *d_data = 1/(*d_data);
        *d_data = (*d_data) / (*d_data);
    }
}


int main()
{
    float *d_data;
    cudaMalloc(&d_data, sizeof(float));
    kernel << <1, 1 >> >(d_data);
    //cpu process would be blocking here
    float data;
    cudaMemcpy(&data, d_data, sizeof(int), cudaMemcpyDeviceToHost);
    printf("%f\n",data);
    return 0;
}

使用top查看cpu占用率为100%

%Cpu10 : 75.1 us, 24.9 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

并且我已经确认我启动的 cpu 进程正在 Cpu10 上运行。

我错过了什么吗?我非常感谢您的帮助!

【问题讨论】:

    标签: c cuda gpu cpu


    【解决方案1】:

    CPU 进程(实际上是线程)不会挂起。

    内核调用后的cudaMemcpy 操作被发送到同一个 cuda 流(default stream),因此它阻塞(CPU 线程)并等待内核完成。

    cudaMemcpy 调用中的块(默认情况下)是 CPU 旋转等待,而不是线程屈服。

    理论上,you can modify the CUDA device synchronization behavior。但是,您需要对这些标志进行试验,看看是否有任何选项可以为您提供比默认行为更可取的东西。

    如果您知道内核将执行多长时间,您还可以在 CPU 代码中使用类似 sleep() 的函数来让线程特定时间段,然后使用类似 cudaEventQuery 的机制来确定是否继续或继续等待。

    【讨论】:

    • 谢谢!顺便说一句,使用异步函数启动两个内核函数,它们将在 gpu 上执行,在一个 cpu 进程中,这两个内核函数会同时在 gpu 中运行吗?还是只是交替?
    • 这是一个不同的问题,对吧?请在 SO 上分别发布不同的问题。 cmets 不是提出新问题的地方。在发布之前,您可能想搜索有关并发内核的问题,有很多。您可能还想阅读关于异步并发执行CUDA programming guide部分。
    • 我为我的不当行为道歉。您的建议解决了我的问题,谢谢!
    猜你喜欢
    • 2023-03-27
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2023-03-20
    • 2016-06-11
    • 2012-11-16
    • 2018-12-13
    相关资源
    最近更新 更多