gpt4 book ai didi

c - 为什么我不能使用gpu来降低cpu占用率?

转载 作者:太空宇宙 更新时间:2023-11-04 02:41:46 24 4
gpt4 key购买 nike

来自 cuda cpu function - gpu kernel overlap ,我知道如何同时执行 gpu 和 cpu 功能。但是还有一种情况,gpu和cpu函数必须串行执行,问题是当cpu被gpu kernel执行阻塞时,cpu进程会suspend吗?如果是的话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 上运行。

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

最佳答案

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

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

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

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

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

关于c - 为什么我不能使用gpu来降低cpu占用率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31151874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com