cudafree()耗时的疑惑!

leayaung 2010-08-20 01:43:29
小弟写了个小程序,程序中的某个kernel函数是要在某个循环里执行,而kernel函数里申请了很多用于中间计算的gmem,这些gmem在每次循环时都要发生数值的变化,然后在每次循环之后都要释放显存,如下:
for()
{
kernel();
}

kernel()
{
double* d_a ;... ...
cudamalloc();... ...
cudamemset();... ...

cudamemcpy();

......

cudafree();... ...
}

问题是我在测试kernel耗时的时候发现时间几乎全部耗在了第一个调用的cudafree()上面,数据量很大的时候,这部分耗时及其可观。(其他的cudafree()耗时几乎全部为零)
请问有没有那位碰到过类似的额问题,应该怎样解决才好???
另外我自己试着在循环之外申请内存,这样在所有的循环结束之后再释放显存,但是又出现一个问题,就是每次的cudamemcpy()的耗时突然变大,而这在修改之前几乎是不耗时的。

感谢高手指点!!!!!!!!!
...全文
629 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Baezhou 2012-06-15
  • 打赏
  • 举报
回复
请问这个问题解决了吗?
  • 打赏
  • 举报
回复
挺有意思的。
leayaung 2010-08-21
  • 打赏
  • 举报
回复
每次计时都要同步操作吗?包括cudaFree()?我看到的相关例子都是在执行kernel后加cudaThreadSynchronize();
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 leayaung 的回复:]
是通过clock()完成计时的,计时方面应该问题不大的。
[/Quote]

问的是计时前是否注意同步了?
leayaung 2010-08-20
  • 打赏
  • 举报
回复
是通过clock()完成计时的,计时方面应该问题不大的。
  • 打赏
  • 举报
回复
1)LZ如何测试时间的?时间的测试方法是否正确?
2)一般是一次申请一次释放更有效。
3)一般一次申请一块,在程序中自己分块使用更有效。
leayaung 2010-08-20
  • 打赏
  • 举报
回复
具体应该怎么理解?
windog18 2010-08-20
  • 打赏
  • 举报
回复
因为kernel是异步调用的吧

579

社区成员

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

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