关于使用CUDA时,CPU使用率的问题

stanford_lhi 2010-02-24 05:00:26
我在使用CUDA做视频流处理时碰到两个问题,希望哪位高手能帮帮我,谢谢啦!

1: 在使用调用kenerl时,如调用func<<<dimGird,dimBlock>>>(...)时,为什么我测试发现反而CPU使用率会提升? 注释掉此行代码,即不启用内核时,CPU使用率保持不变。 即调用内核时,为什么会提升CPU使用率?(我是从0%提升到了25%!)

2: 我现在使用的是GF240M的显卡,有96个流处理器,我在使用单线程处理一个视频时,使用了16个block,那么我使用多线程并行调用内核,那么是不是应该我可以同时使用96/16=6个线程,并保持计算速度和内存都不变? 我现在测试时发现,CPU使用率在使用4个线程时是使用单线程时的4倍!而整个的运行速度是使用单线程时慢了3倍!内存也是4倍!

内存增加可以理解,但CPU使用率和运行速度的增加我就不明白了


...全文
1038 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
OpenGPU2010 2010-03-04
  • 打赏
  • 举报
回复
先mark上,下班了再看~~


---------------------------------------------------------------------------------

OpenGPU论坛http://www.opengpu.org/bbs

OpenGPU Graphics Open Source community(图形开源社区),聚焦领域(focus domain)包括:
* GPU Architecture(图形处理器体系结构)
* Graphics Algorithm(图形算法)
* GPGPU Programming (面向通用的图形处理器编程)
* Open Source Rendering Engine(开源渲染器)
* Open Source GPU Simulator/RTL Implement(开源GPU模拟器 )
stanford_lhi 2010-03-03
  • 打赏
  • 举报
回复
...... 没人回答啊
stanford_lhi 2010-03-02
  • 打赏
  • 举报
回复
哪位大侠帮帮忙啊!
自己顶一个先!
stanford_lhi 2010-03-02
  • 打赏
  • 举报
回复
按照大家的意思是我的显卡太低档了?

我现在使用的是利用opencv读取本地视频,再显示,其中读取的过程是必须的,显示可以屏蔽。

随着图像的增大,CPU使用率和GPU耗时都随之增加。

我的显卡是96个流处理器,每个block最多可以处理512个线程。

我想的是一个线程处理一个点,现在我的测试结果是

处理 88*72 (6336个点)的图像 dimBlock(16,16) GPU耗时16ms CPU使用率增加为16%
dimBlock(11,36) GPU耗时16ms CPU使用率增加为16%

处理 88*72*4 (25344个点)的图像 dimBlock(16,16) GPU耗时47ms CPU使用率增加为24%
dimBlock(16,32) GPU耗时47ms CPU使用率增加为24%

处理 88*72*9 (57024个点)的图像 dimBlock(16,16) GPU耗时94ms CPU使用率增加为16%
dimBlock(16,32) GPU耗时94ms CPU使用率增加为16%

那么问题出来了

1. 是不是我可以最多同时处理96*512个点,最少也可以处理96*256个点?

2. 为什么当线程个数不同时(我甚至使用4个8个16个等都测试过),GPU处理的时间还是没有变?(重点问题)

3. 谁能给我讲讲block与thread在并行处理时该如何配合使用?

谢谢各位大侠了!
OpenGPU2010 2010-03-01
  • 打赏
  • 举报
回复
引用 17 楼 l7331014 的回复:
足够多的block和足够的thread只是逻辑上的,实际还是要硬件来跑的.
LZ的卡太低档了.当所有硬件全"全力"后,处理时间上升是当然的.
还有只有256MB显存,又要显示视频.估计驱动处理显存也会费时不少.(就向小内存系统上的OS一样)


NOD~~!!!!!256过于小了………………

强大阿!!回头去给搂主捧场。

---------------------------------------------------------------------------------

OpenGPU论坛http://www.opengpu.org/bbs

OpenGPU Graphics Open Source community(图形开源社区),聚焦领域(focus domain)包括:
* GPU Architecture(图形处理器体系结构)
* Graphics Algorithm(图形算法)
* GPGPU Programming (面向通用的图形处理器编程)
* Open Source Rendering Engine(开源渲染器)
* Open Source GPU Simulator/RTL Implement(开源GPU模拟器 )
  • 打赏
  • 举报
回复
足够多的block和足够的thread只是逻辑上的,实际还是要硬件来跑的.
LZ的卡太低档了.当所有硬件全"全力"后,处理时间上升是当然的.
还有只有256MB显存,又要显示视频.估计驱动处理显存也会费时不少.(就向小内存系统上的OS一样)
stanford_lhi 2010-02-27
  • 打赏
  • 举报
回复
引用 15 楼 opengpu2010 的回复:
难道你是单卡多线程?????


由于不支持单卡多线程,因此我现在使用的是同时提取多个视频中的多幅图像,并将图像合并成一张大图,最后将此大图传入内核函数中进行处理

现在的问题是,我的机器是双核1.6G GF240GT的显卡,实际显存256M,96个流处理器

1. 调用内核函数会有一定的CPU使用率,除去读取和现实视频的使用率,
对于单张图像,CPU使用率增加 16%
对于4张图像,CPU使用率增加 24%
对于9张图像,CPU使用率增加 19%
16张图像后显存不够,因此没有测试
我想知道的是为什么会有这么高的CPU使用率?

2. 除去CPU使用率不考虑,
对于单张图像, GPU耗时16ms
对于4张图像, GPU耗时47ms
对于9张图像, GPU耗时94ms
我使用的是2维的block和thread,发现增加thread的个数对GPU耗时并没有太大的影响,这个又是为什么?
我的单张图像大小是88*72 每个blobk线程个数暂时使用的是64*4=256个

理论上来说,既然有足够多的block和足够的thread,那么对于不太明显的图像大小的增加,对GPU的计算负担不应该有这么明显的影响。


OpenGPU2010 2010-02-27
  • 打赏
  • 举报
回复

难道你是单卡多线程?????



---------------------------------------------------------------------------------

OpenGPU论坛http://www.opengpu.org

OpenGPU Graphics Open Source community(图形开源社区),聚焦领域(focus domain)包括:
* GPU Architecture(图形处理器体系结构)
* Graphics Algorithm(图形算法)
* GPGPU Programming (面向通用的图形处理器编程)
* Open Source Rendering Engine(开源渲染器)
* Open Source GPU Simulator/RTL Implement(开源GPU模拟器 )
stanford_lhi 2010-02-26
  • 打赏
  • 举报
回复
kernel程序不算复杂

后面又经过了一系列测试发现:

当把测试图像由w*h增加到2w * 2h后,即使只执行1 3 ,CPU一样由较高的负载,但几乎并不消耗时间!




  • 打赏
  • 举报
回复
引用 10 楼 stanford_lhi 的回复:
1 2 3 4 5        CPU使用率为25%
1 2 4 5          CPU使用率为25%
1 3              CPU使用率为0%
1 2 3(注释掉4 5)  CPU使用率为0%
1 2 3 4          CPU使用率为44%
1 2 3 5          CPU使用率为17%



1 2 3 4 5 : 3等待内核2执行结束,cpu费时.
1 2 4 5 : ?
1 3 : 没有内核执行,也就没有等待
1 2 3(注释掉4 5) : 内核为空,等同于上行(内核执行时间<0.1ms)
1 2 3 4 : 3等待内核2执行结束,cpu费时.
1 2 3 5 : 3等待内核2执行结束,cpu费时.
lixingjian4 2010-02-26
  • 打赏
  • 举报
回复
用cudaEventQuery来实现每隔一段时间查询Kernel是否结束,可以把CPU利用率明显降下来
但是性能会有影响,尤其是Kernel执行时间特别短的时候~
stanford_lhi 2010-02-25
  • 打赏
  • 举报
回复
引用 4 楼 stanford_lhi 的回复:
1> 
    1. 数据从CPU拷进GPU
    2. 内核函数
    3. 数据从GPU拷出


进行了以下测试
1. 数据从CPU拷进GPU
3. 数据从GPU拷出
CPU使用率0%

1. 数据从CPU拷进GPU
2. 内核函数
3. 数据从GPU拷出
CPU使用率25%

1. 数据从CPU拷进GPU
2. 内核函数
CPU使用率25%


步骤3可以省略,因为拷贝出来的图像是用来测试的

测试可以发现只要调用了内核都会有CPU使用率

步骤1 拷贝的一帧视频流的图像
步骤3 拷出的是处理后的图像
内核函数中的核心算法模型参数在处理过程中长期使用

  • 打赏
  • 举报
回复
引用 7 楼 l7331014 的回复:
抱歉,没说清楚.
3. 数据从GPU拷出
缺省的等待kernel执行结束.


你是说在等待过程中CPU使用率会上升?
  • 打赏
  • 举报
回复
引用 6 楼 gogdizzy 的回复:
引用 5 楼 l7331014 的回复:1)正常.数据copy也要cpu配合的.

但是他注释掉2并没有改变copy过程啊。


抱歉,没说清楚.
3. 数据从GPU拷出
缺省的等待kernel执行结束.
  • 打赏
  • 举报
回复
引用 5 楼 l7331014 的回复:
1)正常.数据copy也要cpu配合的.


但是他注释掉2并没有改变copy过程啊。
  • 打赏
  • 举报
回复
1)正常.数据copy也要cpu配合的.
2)是的.而且,对单卡而言,CPU的多线程调用内核不一定正确.(正确的做法是一卡一线程)
stanford_lhi 2010-02-25
  • 打赏
  • 举报
回复
1> 我没有使用cudaThreadSynchronize等待,并且在调用内核后,只做了单幅图像的拷贝,大致代码类似于:(由于我们是封闭开发,代码不能从公司内网拿出,希望理解)
.cu 文件
1. 数据从CPU拷进GPU
2. 内核函数
3. 数据从GPU拷出
测试时发现注释2,CPU使用率为0%, 打开2时,CPU使用率25%

2> 内核现阶段不支持并发调用? 那么就是说,对于单张显卡,现在我无法同时做到处理多个视频时的实时?也就是说CPU的多线程调用内核,对于内核而言是顺序执行的,所以消耗的时间也会随着线程的增加而呈倍数递增?
  • 打赏
  • 举报
回复
kernel程序很复杂吗?(cubin文件很大吗?)
gpu的执行代码上传也会费一点点cpu时间。
stanford_lhi 2010-02-25
  • 打赏
  • 举报
回复
代码形式大概是下面这样

__device__ void fun1(..)
{
...
}

__device__ void fun2(...)
{
...
}

__global__ void func(...)
{
fun1(...); // 4
fun2(...); // 5
}

extern "C" main()
{
数据从CPU拷进GPU等前期操作; // 1
func<<<dimGird, dimBlock>>>(...) // 2
数据拷出 // 3
释放等
}

1 2 3 4 5 CPU使用率为25%
1 2 4 5 CPU使用率为25%
1 3 CPU使用率为0%
1 2 3(注释掉4 5) CPU使用率为0%
1 2 3 4 CPU使用率为44%
1 2 3 5 CPU使用率为17%

说明在主机上调用__global__函数CPU没有负担
那么为什么在__global__函数里调用__device__函数CPU反而有负担?

希望哪位大侠能帮帮我! 小弟在此谢过!
  • 打赏
  • 举报
回复
1)启动kernel时,要执行cuda运行库来启动,因此cpu一时利用率上升是正常的,启动完了(<0.1ms)就该下降了.另外,如果执行cudaThreadSynchronize等待kernel执行完毕的话,cpu利用率会一直在100%,估计是cudaThreadSynchronize的实现问题.
2)现在的cuda,一个线程对应一个卡.如果你用多线程的话要有对应的多块独立的显卡.到fermi(GTX4xx)才支持不超过16个的kernel同时执行(根据N社资料)
加载更多回复(2)

579

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧