求助:主机端分配内存、主机与设备端、设备与主机端数据传输速度慢的问题

mimi122 2010-02-21 04:19:06
我所用的硬件和软件条件
显卡:
NVIDIA GeForce 8600 GT
驱动及其它:
cudatoolkit_2.3_win_32
cudasdk_2.3_win_32
cudadriver_2.3_winxp_32_190.38_general
电脑配置:
1G内存,1.99GHz
操作系统:
XP SP3

我的程序测试结果
分配设备端内存耗时43ms:cudaMalloc((void**)&d_ZoomImg, 3400*3400);
分配主机端内存耗时9ms:unsigned char* h_ZoomImg = (unsigned char *)malloc(size);
设备端数据拷回到主机端耗时20ms:cutilSafeCall( cudaMemcpy( h_ZoomImg, d_ZoomImg, size, cudaMemcpyDeviceToHost) );
内核程序耗时27ms;

我的问题
1.在以上处理中,所花费的时间是否合理?
2.在资料中,看到GTX260的一些优势:
1)在host-to-device,device-to-host的带宽比8600GT、9600GT要高
2)而且计算能力为1.3(支持zero-copy技术)
3)SM数量为24
如果我用GTX260显卡,想改善主机端内存分配、主机与设备端、设备与主机端数据传输的速度,效果会很明显吗,GTX260现在市场价大概1000左右吧

...全文
198 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
OpenGPU2010 2010-02-27
  • 打赏
  • 举报
回复
引用 7 楼 l7331014 的回复:
引用 5 楼 mimi122 的回复:
按照以上的带宽信息,执行cudaMemcpy( h_ZoomImg, d_ZoomImg, 3400*3400, cudaMemcpyDeviceToHost)大概需要8ms,而我的程序中实际测得的却是20ms,除去硬件问题,两种结果相差也不会这么大呀,这是什么原因呢?

一次传送数据块的大小影响带宽的.你可以写一简单程序从一次传送1KB到一次传送1MB试试,会发现差很多的.


对,因为每次传输之前都要有很多OS开销的,总线开销也有!





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

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模拟器 )
mimi122 2010-02-26
  • 打赏
  • 举报
回复
问题解决:
在测试执行cutilSafeCall( cudaMemcpy( h_data, d_data, size, cudaMemcpyDeviceToHost) )所用的时间时,因为这句是在内核函数执行之后,所以需要写入cutilCheckError( cudaThreadSynchronize() ),我修改程序后,得到的测试结果就和bandwidthtest中的结果差不多了。
  • 打赏
  • 举报
回复
引用 11 楼 mimi122 的回复:
呵呵,我又错了

因为设备端到主机端的cudaMemcpy是blocking的,这个函数会保证所有数据都COPY完了才会执行数据处理,所以不需要cudaThreadSynchronize()

那我的问题就仍然等待大家的帮助


你的传输速度是如何测试的?

正确的该是:
kernel<<<>>>;
cudaThreadSynchronize();
开始计时;
复制数据;
结束计时;
mimi122 2010-02-26
  • 打赏
  • 举报
回复
呵呵,我又错了

因为设备端到主机端的cudaMemcpy是blocking的,这个函数会保证所有数据都COPY完了才会执行数据处理,所以不需要cudaThreadSynchronize()

那我的问题就仍然等待大家的帮助
mimi122 2010-02-25
  • 打赏
  • 举报
回复


一次传送数据块的大小影响带宽的.你可以写一简单程序从一次传送1KB到一次传送1MB试试,会发现差很多的.
[/Quote]

是的,我用BandWidth程序测试了一下,当HOST-TO-DEVICE,DEVICE-TO-HOST传输的数据越大时,测得的带宽却更高了。但是,当传输同样大小的数据,在我的程序中测得的DEVICE-TO-HOST的传输速度比用BandWidth程序测试的传输速度慢一倍
mimi122 2010-02-24
  • 打赏
  • 举报
回复
又发现了一些问题,请教 l7331014

我运行了BandWidthTest程序,结果如下:
Running on......
device 0:GeForce 86ooGT

Quick Mode
Host to Device Bandwidth for Pageable memory
Transfer Size <bytes> Bandwidth<MB/s>
33554432 1571.7

Quick Mode
Device to Host Bandwidth for Pageable memory
Transfer Size <bytes> Bandwidth<MB/s>
33554432 1312.2

Quick Mode
Device to Device Bandwidth
Transfer Size <bytes> Bandwidth<MB/s>
33554432 14251.1

按照以上的带宽信息,执行cudaMemcpy( h_ZoomImg, d_ZoomImg, 3400*3400, cudaMemcpyDeviceToHost)大概需要8ms,而我的程序中实际测得的却是20ms,除去硬件问题,两种结果相差也不会这么大呀,这是什么原因呢?
  • 打赏
  • 举报
回复
引用 6 楼 mimi122 的回复:
刚使用pinned memory分配主机端内存,这种方法可以达到更高的主机端-设备端的数据传输带宽,但分配内存花费的时间比malloc大很多.


pinned memory是不可交换内存,要确保这样一块内存当然比malloc要大很多.
  • 打赏
  • 举报
回复
引用 5 楼 mimi122 的回复:
按照以上的带宽信息,执行cudaMemcpy( h_ZoomImg, d_ZoomImg, 3400*3400, cudaMemcpyDeviceToHost)大概需要8ms,而我的程序中实际测得的却是20ms,除去硬件问题,两种结果相差也不会这么大呀,这是什么原因呢?


一次传送数据块的大小影响带宽的.你可以写一简单程序从一次传送1KB到一次传送1MB试试,会发现差很多的.
mimi122 2010-02-24
  • 打赏
  • 举报
回复
刚使用pinned memory分配主机端内存,这种方法可以达到更高的主机端-设备端的数据传输带宽,但分配内存花费的时间比malloc大很多.

cudaMallocHost((void**)&h_data,size);//29ms
cutilSafeCall( cudaMemcpy( h_data, d_data, size, cudaMemcpyDeviceToHost) ); //7ms

unsigned char* h_data = (unsigned char *)malloc(size);//9ms
cutilSafeCall( cudaMemcpy( h_data, d_data, size, cudaMemcpyDeviceToHost) ); //20ms
mimi122 2010-02-22
  • 打赏
  • 举报
回复
我的显卡是插在主板上的PCI-E 2.0 x16插槽,而NVIDIA GeForce 8600 GT应该是PCI-E 1.0 x16,我想知道哪些显卡的PCI-E是2.0的?
如果用PCI-E是2.0的显卡,主机与设备,设备与主机间的数据传输速度应该会有所提高吧。

非常感谢l7331014
  • 打赏
  • 举报
回复
引用 3 楼 mimi122 的回复:
我的显卡是插在主板上的PCI-E 2.0 x16插槽,而NVIDIA GeForce 8600 GT应该是PCI-E 1.0 x16,我想知道哪些显卡的PCI-E是2.0的?
如果用PCI-E是2.0的显卡,主机与设备,设备与主机间的数据传输速度应该会有所提高吧。


新的92系列和200系列都是2.0的.
理论上2.0比1.0快一倍.
  • 打赏
  • 举报
回复
引用楼主 mimi122 的回复:
我的问题
1.在以上处理中,所花费的时间是否合理?
2.在资料中,看到GTX260的一些优势:
1)在host-to-device,device-to-host的带宽比8600GT、9600GT要高
2)而且计算能力为1.3(支持zero-copy技术)
3)SM数量为24
如果我用GTX260显卡,想改善主机端内存分配、主机与设备端、设备与主机端数据传输的速度,效果会很明显吗,GTX260现在市场价大概1000左右吧

1)基本合理的吧.
2-1)估计关键还是在主板,是否是PCI-E 2.0x16.不然,该没多少改进.
2-2)zero-copy意义不大,目前260用的是独立显存.
2-3)错了,该是27个吧.
其它:
主机端内存分配基本改变不了.
主机与设备端、设备与主机端数据传输的速度的关键更在主板的接口上.

579

社区成员

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

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