我对Cuda的新手相对较新,目前正在一个项目中加速使用GPU附加的嵌入式系统中的计算机视觉应用(NVIDIA TX1(。我要做的是在两个库之间选择:openCV和VisionWorks(包括OpenVX(。
目前,我制作了测试代码以运行Canny Edge检测算法,并且两个库显示了不同的执行时间(VisionWorks实施时间约为30〜40%(。
所以,我想知道可能是什么原因,因此介绍了花费最多时间的内核:opencv4tegra的" canny :: edgeshysterissesislocallocernel",该核心正在占用整个应用程序的37.2%(从OpenCV实施和VisionWorks和VisionWorks和VisionWorks均占用实施(和" eDgeshystresisLocal"来自VisionWorks。
我遵循了"指导分析",探查师建议这些应用既是潜伏期结合的,又是VisionWorks的" Edgeshysterissislocal"的捕获,以及" Canny :: Edgeshysterissislocallocallocernel",opencv4tegra。
opencv4tegra -Canny :: Edgeshysteresislocallocalnel
VisionWorks -Edgeshysteresislocal
所以,我的问题是,
-
从分析中,我能说出不同性能的原因?
-
此外,在分析CUDA应用程序一般情况下,从哪里开始的时候?我的意思是,有很多指标,很难说出看什么。
-
一般而言,是否有一些有关CUDA应用的教育材料?(我查看了Nvidia的许多幻灯片,我认为他们只是在说指标的定义,而不是从哪里开始。(
- 据我所知,NVIDIA不提供VisionWorks和OpenCv4Tegra的源代码。如果我错了,请纠正我。
预先感谢您的答案。
1/shared_memory用法在两个库之间有所不同,这可能是性能差异的原因。
2/通常使用三个指标来知道我的算法是否对CUDA设备进行了很好的编码:
- 内核的内存使用率(带宽(
- 使用的寄存器数量:是否有登记册溢出?
- 共享内存库冲突的数量
3/我认为互联网上有很多东西..
另一件事:
如果您只想限定LIB与另一个LIB的使用来选择最好的,为什么需要理解每个实现(这很有趣,但不是先决条件(?
为什么不根据循环时间来测量算法性能以及根据度量标准的结果质量(误报,一组已知结果的平均误差,...(