怎样使得共享存储器的使用具有可扩展性设计

在GPU的存储器资源中,共享存储器是比较快的,但是其大小有限,而且由于某些原因,有时会产生可扩展性问题,比如在数据量为多少时,共享存储器够用,而数据量大了就不够了。在这类问题中,大家是怎么解决的呢?

我觉得,一般情况下,应该使用这种模式1:
1、在block大小固定的情况下,使用共享内存的多少和数据量大小没有关系(和一个block内的线程数成比例),数据量大小只和block数目有关系,而每个block使用的共享内存是固定的。
2、如果每个block使用的共享内存和数据量大小有关系,可以采用分步读取全局存储器数据放入共享内存,而每次放入共享内存的数据是固定的,只不过是分多次载入而已。
其实由于共享内存大小的限制,每次使用共享内存的大小超过4096bytes的时候,一个SM可以发射的block数目就会减少,共享内存就会成为占用率下降的一个主要因素。

[ 本帖最后由 siheng303 于 2010-7-2 18:05 编辑 ]

呵呵!大多数时候,共享存储器的使用没有什么问题,但是有些时候数据是天然相关的,block内线程多少也受制于此,这种情况在科学计算中是很常见的。比如在某些计算中,要将计算区域划分为网格,而网格大小是由问题决定的,这就导致了每个网格使用的共享存储器不是由人决定的,另外这种情况下分步导入也不能用。

[
这种情况你可以在CPU做判断,如果网格大小在一定的尺寸下,就把数据放入共享存储器,如果网格大小超过了一定的尺寸,最好能用分步把数据放入共享存储器(或者改变算法),如果不能分步,那就只能用放弃共享存储器了,那要看你是做应用还是做研究,如果做研究的话你只要研究在一定尺寸下能加速多少倍就可以了(追求的是性能加速比),如果做应用那就要考虑的更加全面。

是啊!感觉cuda的那些东西做应用太麻烦了,要考虑的问题太多。还得准备一个串行的,万一别人没卡,呵呵!

[ 本帖最后由 cyrosly 于 2010-9-19 20:17 编辑 ]