为什么我的cuda程序如此耗时

xxh723 2010-03-08 03:55:27
我先用一个函数来在显卡上分配内存,然后由主函数来进行计算,最后由一单独的函数来释放内存。
我只计算了主函数所用的时间,结果时间非常大。
如果我将kernel函数给注释掉,时间几乎为0。
但如果我将kernel函数什么也不做,一进去就return,结果时间还是非常大,几乎和原来的时间一样大。
这么多的时间都被浪费在哪里了?望有人能给我指点下。
我GPU函数的速度比CPU慢了几乎一千倍...
...全文
493 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxh723 2010-03-11
  • 打赏
  • 举报
回复
那在一个cpp文件中调用两个cu文件中的函数,怎么让这两个函数之间进行数据传递呢?
除了一个包含指针的结构体以外我还想不到什么比较好的方法。
xxh723 2010-03-11
  • 打赏
  • 举报
回复
我也感觉kernel什么都没做就返回了,但也看不出原因。

我不是直接拷贝结构体的,是把结构体里面的每一个指针分别进行拷贝的。
这样应该没有问题了阿,如果一个一个拷贝就太麻烦了。
Maschinenwissen 2010-03-10
  • 打赏
  • 举报
回复
你的kernel怎么设计的?内存怎么安排的?这些才是关键;
  • 打赏
  • 举报
回复
少了一个字:
结构体的指针->结构体内的指针
  • 打赏
  • 举报
回复
引用 23 楼 xxh723 的回复:
用cudaMemcpy了

我用一个结构体包含了要拷贝到显存上的数据的指针,并在.cu文件的init函数里面对这些指针分配内存和赋值。


如何复制到GPU的?带指针结构体是不能直接用cudaMemcpy的,换句话说结构体的指针很可能是指向无效区域的.
  • 打赏
  • 举报
回复
哦,我只是看到你说结果全是0,所以猜测kernel什么也没做就把结果返回来了。
xxh723 2010-03-10
  • 打赏
  • 举报
回复
用cudaMemcpy了

我用一个结构体包含了要拷贝到显存上的数据的指针,并在.cu文件的init函数里面对这些指针分配内存和赋值。
再由一个主函数使用这个结构体进行计算,将计算后的结果拷贝回cpu的数组。
我很注意cudaMemcpy的使用的。
  • 打赏
  • 举报
回复
你用cudaMemcpy函数将内存数据copy到显存了吗?

emu模式不用copy,但是用真正的gpu的时候要copy
xxh723 2010-03-10
  • 打赏
  • 举报
回复
如果我在emulation模式下运行计算出来的结果与CPU计算出来的结果是一样的,但在真正的硬件上面运行的时候计算不出来结果,这主要会是什么样的原因呢?

真不好意思,老是问这么小白的问题。
  • 打赏
  • 举报
回复
引用 18 楼 xxh723 的回复:
“如果系统上没有支持 CUDA 的装置,则它会传回 1,而 device 0 会是一个仿真的装置,但不支持 CUDA 1.0 以上的功能。”

这个怎么理解?1.0以上是一个什么样的概念?我不是很理解。


指硬件的计算能力.越是新的芯片计算能力越强.(版本越高)
具体参考<<编程手册>>的附录.
  • 打赏
  • 举报
回复
引用 17 楼 xxh723 的回复:
cudaSetDevice设置的是0,应该对了吧?

我发现这样计算图像梯度的结果和CPU版本是一样的,但计算HOG特征的结果全部是0
我用emulation计算出来HOG的结果与CPU版是一样的

还想问下,sm_10,11,12,13之间有什么区别,我该用哪个好?


你的卡只能用sm_10.
xxh723 2010-03-10
  • 打赏
  • 举报
回复
“如果系统上没有支持 CUDA 的装置,则它会传回 1,而 device 0 会是一个仿真的装置,但不支持 CUDA 1.0 以上的功能。”

这个怎么理解?1.0以上是一个什么样的概念?我不是很理解。
xxh723 2010-03-10
  • 打赏
  • 举报
回复
cudaSetDevice设置的是0,应该对了吧?

我发现这样计算图像梯度的结果和CPU版本是一样的,但计算HOG特征的结果全部是0
我用emulation计算出来HOG的结果与CPU版是一样的

还想问下,sm_10,11,12,13之间有什么区别,我该用哪个好?
xxh723 2010-03-10
  • 打赏
  • 举报
回复
我用的是这个初始化函数:

bool InitCUDA()
{
int count;

cudaGetDeviceCount(&count);
if(count == 0) {
fprintf(stderr, "There is no device.\n");
return false;
}

int i;
for(i = 0; i < count; i++) {
cudaDeviceProp prop;
if(cudaGetDeviceProperties(&prop, i) == cudaSuccess) {
if(prop.major >= 1) {
break;
}
}
}

if(i == count) {
fprintf(stderr, "There is no device supporting CUDA 1.x.\n");
return false;
}

cudaSetDevice(i);

return true;
}
  • 打赏
  • 举报
回复
还有看一下是否是最新的8500对应的驱动.
  • 打赏
  • 举报
回复
引用 13 楼 xxh723 的回复:
1)emu是cpu模拟gpu,肯定慢.
2)如果关闭这个选项我的程序就无法运行:你的sdk及开发环境是否安装正确?还有就是是否是N卡


我的显卡是8500,应该支持cuda啊
但调用cudaGetDeviceCount的时候会显示是1,device 0 是不是虚拟的硬件设备?
sdk和toolkit都安装了阿。


有N卡时应该直接使用device 0!这时,device 0已是实际卡,而非虚拟设备.可以通过cudaGetDeviceProperties返回的cudaDeviceProp中的name来验证.

LZ的cudaSetDevice是多少?
xxh723 2010-03-10
  • 打赏
  • 举报
回复

1)emu是cpu模拟gpu,肯定慢.
2)如果关闭这个选项我的程序就无法运行:你的sdk及开发环境是否安装正确?还有就是是否是N卡


我的显卡是8500,应该支持cuda啊
但调用cudaGetDeviceCount的时候会显示是1,device 0 是不是虚拟的硬件设备?
sdk和toolkit都安装了阿。
  • 打赏
  • 举报
回复
引用 9 楼 xxh723 的回复:
我的cuda程序运行的结果是正确的阿,只是时间特别慢。

我的kernel函数即使什么也不做,也很耗时。

我怀疑是不是我开启了属性配置中的  emulation mode 选项?
这个选项是让我的CPU来模拟GPU吗?
如果关闭这个选项我的程序就无法运行。


1)emu是cpu模拟gpu,肯定慢.
2)如果关闭这个选项我的程序就无法运行:你的sdk及开发环境是否安装正确?还有就是是否是N卡?
  • 打赏
  • 举报
回复
引用 9 楼 xxh723 的回复:
我怀疑是不是我开启了属性配置中的  emulation mode 选项?
这个选项是让我的CPU来模拟GPU吗?
如果关闭这个选项我的程序就无法运行。


这个说到点上了,cpu模拟gpu速度相当慢,而且不一定能够再现gpu的效果。

大哥,你的显卡是什么型号?支持cuda否?
xxh723 2010-03-10
  • 打赏
  • 举报
回复
另外,我无法开启优化选项,如果开启则会出现下面的情况:

“无法打开输入文件 “xxx.cu.obj” ”
加载更多回复(8)

581

社区成员

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

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