速度疑问【cpu和gpu(CUDA)的性能比较以及优化使用的探讨】

danxger 2008-10-27 11:11:47
加精
各位大侠,我的笔记本电脑显卡是独立GF8400MG,128MB的显存。我做了试验,GPU计算块中最大线程数为512,支持的最大块数为21056,我用GPU计算512*21056个数加1,得到的运行时间为0.375秒,其中包括前100个数的打印。而我用CPU for循环对512*21066个数逐个加1,得到的运行时间为0.171秒,而且我做了很多试验,GPU运行的时间都比CPU逐个计算的运行时间多出了1倍,我就纳闷了,是这个技术提倡不成功,还是其他原因,请各位大侠探讨一下。。。
...全文
3577 54 打赏 收藏 转发到动态 举报
写回复
用AI写文章
54 条回复
切换为时间正序
请发表友善的回复…
发表回复
硅步万里 2010-09-26
  • 打赏
  • 举报
回复
gpu 9400gt 813ms
cup E2180 6344ms
microsx 2009-10-15
  • 打赏
  • 举报
回复
好贴领分!!!!看后受益不少
Thomasyang5 2009-07-24
  • 打赏
  • 举报
回复
精辟!
电视人 2009-07-07
  • 打赏
  • 举报
回复
网上又搜到了这个例子,那就再写一点

楼主把 reverseArrayBlock < < < dimGrid, dimBlock >>>( d_a ); 这句注释掉,是不是会发现执行时间还是那么长?也就是说GPU执行几乎没占时间,全是内存拷贝占的

电视人 2009-07-06
  • 打赏
  • 举报
回复
看这个例子头大了很久,后来才看出根本是两个算法

版主你就说明一下是楼主内核代码量太少导致上下文什么的开销相对大,你的程序并非优化

不然初学者会糊涂了
tonycharce 2009-06-20
  • 打赏
  • 举报
回复
mark。

不过8400本来就很鹾的吧。一个multicore
OpenHero 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 qijun83 的回复:]
引用 9 楼 bbcnews24 的回复:

我的笔记本电脑显卡是独立NVS135M. CPU 是T7100
Debug 模式运行
楼主的程序:GPU时间为0.453秒,CPU时间为0.234秒
开勇的程序:GPU时间为1.141秒,CPU时间为6.234秒


我看GPU的两个程序
开勇哥改了
__global__ void reverseArrayBlock( int*d_a)
{  int dx=blockDim.x*blockIdx.x+threadIdx.x;
 
  d_a[dx]=d_a[dx]+1;

}
__global__ void reverseArrayBlock( int*d_a)

    int dx=…
[/Quote]

外面还有一个宏:)循环次数改了
qijun83 2009-05-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bbcnews24 的回复:]
我的笔记本电脑显卡是独立NVS135M. CPU 是T7100
Debug 模式运行
楼主的程序:GPU时间为0.453秒,CPU时间为0.234秒
开勇的程序:GPU时间为1.141秒,CPU时间为6.234秒
[/Quote]

我看GPU的两个程序
开勇哥改了
__global__ void reverseArrayBlock( int*d_a)
{ int dx=blockDim.x*blockIdx.x+threadIdx.x;

d_a[dx]=d_a[dx]+1;

}
__global__ void reverseArrayBlock( int*d_a)
{
int dx=blockDim.x*blockIdx.x+threadIdx.x;

for (int i = 1; i <= LOOP_ADD_TIME; i++)
{
d_a[dx] += i;
}
}

还少了一个同步
还有其它的改动吗?
我没看出来
速度差这么多???
naughty_iori 2009-03-09
  • 打赏
  • 举报
回复
卡不行吧,我的卡是8800GT,CPU 3.0GHz

blocks: 21056
gpu time is 265.000000 ms

cpu time is 6296.000000 ms
Press any key to continue . . .

另外其实这个程序是把GPU/CPU之间的数据传输也算在里面的,卡不行的话数据传输也很慢。而且数据传输跟主板关系也很大,比如我用NV的板,HOST到DEVICE大概5GB/s,我同事用AMD的板,一样的卡,就只有2GB/s.

[Quote=引用 42 楼 guojiancong 的回复:]
在笔记本上debug模式下运行开勇的程序结果如下:
(#define LOOP_ADD_TIME 1000)

Using device 0: Quadro NVS 140M
blocks: 21056
gpu time is 10234.000000 ms

cpu time is 7625.000000 ms

Press ENTER to exit...

修改kernel函数为:
__global__ void reverseArrayBlock( int* d_a )
{
int dx=blockDim.x*blockIdx.x+threadIdx.x;
int temp = d_a[dx];

for (int i = 1; i <= LOOP_ADD_TIME…
[/Quote]
guojiancong 2009-03-09
  • 打赏
  • 举报
回复
谢谢
原来也是认为自己的卡不行,只有16个流处理器
但是看到9楼的测试结果(差不多的显卡)比我的好很多
而手头也没有其他可用的测试机子
所有怀疑自己是不是在使用和配置cuda上出了问题
guojiancong 2009-03-08
  • 打赏
  • 举报
回复
在笔记本上debug模式下运行开勇的程序结果如下:
(#define LOOP_ADD_TIME 1000)

Using device 0: Quadro NVS 140M
blocks: 21056
gpu time is 10234.000000 ms

cpu time is 7625.000000 ms

Press ENTER to exit...

修改kernel函数为:
__global__ void reverseArrayBlock( int* d_a )
{
int dx=blockDim.x*blockIdx.x+threadIdx.x;
int temp = d_a[dx];

for (int i = 1; i <= LOOP_ADD_TIME; i++)
{
temp += i;
}

d_a[dx] = temp;
}
运行结果为:
Using device 0: Quadro NVS 140M
blocks: 21056
gpu time is 3235.000000 ms

cpu time is 7610.000000 ms

Press ENTER to exit...

但是和期望的差距还很大
原以为在这个测试上GPU应该比CPU至少快一个数量级
还望各位大侠指点一下
是不是我在cuda配置上出了问题
怎样才能得到9楼的结果
chinecuda 2009-02-16
  • 打赏
  • 举报
回复
To30楼:工具包中的头文件和库文件都不是很多,如果缺什么头文件啦,库文件啦都去SDK的安装目录下复制一份到CUDA目录下,我就是把SDK的所有头文件和库文件全部复制过去了!如果要用到cutil32.dll,就去SDK库文件文件夹里复制一份到程序文件目录里就行了。
qin_y_j 2009-02-04
  • 打赏
  • 举报
回复
最重要一点,8400的显存可能是1.4ns或者2.5ns的;
而不是0.8ns或者1.0ns;
因此访问显存成了计算的瓶颈,影响了GPU的效率;
暖处自朝晖 2009-02-03
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 sapwood 的回复:]
楼主换个好点的显卡把?8400是很入门级别的显卡,可以用来调试CUDA程序,但不能用来和CPU比速度的。

8400内部只有2个流处理器。而目前的GTX280有将近200个流处理器。而且没有流处理器的处理能力都比8400的强。

这么一算,就知道CUDA的威力了吧。
[/Quote]

8400内部有8个流处理器,GTX280有240个流处理器.
sapwood 2008-12-09
  • 打赏
  • 举报
回复
楼主换个好点的显卡把?8400是很入门级别的显卡,可以用来调试CUDA程序,但不能用来和CPU比速度的。

8400内部只有2个流处理器。而目前的GTX280有将近200个流处理器。而且没有流处理器的处理能力都比8400的强。

这么一算,就知道CUDA的威力了吧。
OpenHero 2008-11-10
  • 打赏
  • 举报
回复
OpenCL到有可能,X11-CS难,微软现在还不夸平台,还不开放,继续下去,怪不得别人……
Hakurei 2008-11-09
  • 打赏
  • 举报
回复
OpenCL和DX11-CS也许会成标准。。
OpenHero 2008-11-09
  • 打赏
  • 举报
回复
to:sxy0082002
第一个kernel哪里不用shared mem ,直接用register 效率比用shared mem还快,这里有了一个global-》register-》到shared mem的copy过程,其实当global加载到运行的时候,就是写到register的;

第二个,太多的同步,和大范围的访问,在1.0,1.1的硬件上都会造成慢速:)
OpenHero 2008-11-08
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 zamster 的回复:]
32楼:
AMD 有个叫 AMD FireStream 的, 类似于nVidia的CUDA,也很猛。
[/Quote]

firestream也不错:)
zamster 2008-11-08
  • 打赏
  • 举报
回复
32楼:
AMD 有个叫 AMD FireStream 的, 类似于nVidia的CUDA,也很猛。
加载更多回复(29)

581

社区成员

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

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