找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 400|回复: 2

請問如何應用 CUDA programming 計算和處理正確的數字

[复制链接]
发表于 2018-4-16 00:29:11 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2018-4-16 12:03:09 | 显示全部楼层
Jetson TX2
问题一: 256个线程的每个线程的自身使用了多少clocks无意义。因为最终的运行时间不是单个的时间 * 256, 而是一个和单个运行实际几乎看不出任何关系的时间值----因为他们执行的时候,随着使用的资源的情况不同,可能是彼此交错掩盖的,也就是在可能并行。

只有总时间值有意义,该值可以通过多种方式测得。建议看一下手册中的使用event测时,和用profiler查看时间。
如果非得需要每个线程单体的时间值,可以使用CUDA内置的clock()和clock64(). 在你的线程开头和结尾调用一次它们,然后做差即可。但如果刚才说的,该值并无太大的实际的意义。请使用kernel整体的时间值。建议总是使用profiiler。

问题二:在改进了global memory的access pattern后,时间变化情况同样可以用刚才的方式得到(见上)。但光知道时间是无用的。请使用profiler,它会告诉你具体的global memory上的load/store的效率, 你可以看到充分合并的访存之类的效率变化。以及,在一定的working set下,你的cache的efficiency, 包括各级。以及,kernel的整体访存吞吐率,例如多少GB/S之类的,和改进后整体的时间变化。这些都需要通过profiler获得。

问题三:使用profiler可以报告kernel启动形状变化之类的信息的。这个也没有什么问题。可以直接在刚才的(1)后面直接修改block形状,从256改成512,看看有无性能变化。但需要说明的是,改变了block形状,请注意grid形状是否需要跟随修改,以及,注意kernel内部时候正确的处理了block形状后的越界之类的。应当先使用调试器,例如cuda-gdb或者nsight将程序改好调试正确,再上profiler测试性能。

问题四:这个没有什么好说的,使用多个blocks是基本的常识。

问题五:使用shared memory你得知道shared memory和global memory的基本区别(例如更低的延迟和更大的带宽,但是更小的容量。)以及,他们在可见性上的区别(shared memory属于某一个blocks,而global memory属于整体)。在明白这些的情况下,看看能否通过shared memory的使用来换取带宽的变化,也可以直接通过profiler的memory方面的诊断,看到性能的变化。里面会用图表的方式,直接列出常见的3大级别(显存,缓存,shared memory)的从0-10的性能评分。0代表IDLE,10代表Fully Utilized.

问题六:如何改进一个特定的算法,这个需要你来。光给出算法的名字我无法提供任何工作。

问题七:这个依然可以通过profiler中的信息得到,需要注意的是shared_ld_bank_conflict, 和shared_st_bank_conflict, 请注意是bank不是band。你需要理解shared memory的32个banks的情况(手册上有图)。请注意这两个信息只有在一定的shared_ld_transactions和shared_st_transactions,以及shared_read/write/atom的情况下才有比较意义,你需要阅读以下profiler的手册。
需要说明的是,bank conflict不一定可以消除,也不一定需要消除。前者和一定的算法实现有关。后者则和看下是否瓶颈卡在shared memory上,如果瓶颈是计算之类的,优化shared memory访问并无性能提升。

Regards,
屠戮人神
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-16 19:43:42 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

快速回复 返回顶部 返回列表