CUDA 如何查表

我有个256*3的表
const float map[3] = {
{ 0,0,0.51563 },
{ 0,0,0.53125 },
{ 0,0,0.54688 },
{ 0,0,0.5625 },
{ 0,0,0.57813 },
{ 0,0,0.59375 },
。。。。。

{ 0.59375,0,0 },
{ 0.57813,0,0 },
{ 0.5625,0,0 },
{ 0.54688,0,0 },
{ 0.53125,0,0 },
{ 0.51563,0,0 },
{ 0.5,0,0 }
};
这个表应该怎么存放效率会比较高呢?放在全局变量还是共享变量里?

数组大小在3KB左右,完全可以放在shared memory里面!

好,谢谢,如何初始化这个数组呢?
shared float map[256][3]
= {
{ 0,0,0.51563 },
{ 0,0,0.53125 },
{ 0,0,0.54688 },
{ 0,0,0.5625 },
{ 0,0,0.57813 },
{ 0,0,0.59375 },
{ 0,0,0.60938 },
{ 0,0,0.625 },
。。。
{ 0.54688,0,0 },
{ 0.53125,0,0 },
{ 0.51563,0,0 },
{ 0.5,0,0 }
};
我这样初始化失败的,显示: error : initializer not allowed for shared variable

shared memory禁止这样初始化。。。
你需要把map这个数组先拷贝到global memory,然后再block内部用线程把里面的值读取然后写入到shared memory里面去

明白了,谢谢

LZ您的表是只读的,那么也可以考虑constant memory。
以及,您也可以直接用global memory试试看,能否被L2良好地缓冲,如果缓冲效果良好或者访存根本不是瓶颈,那么可以不用费力优化这里。

个人观点,仅供补充上述回答以及供LZ参考。

祝您编码愉快~

对以上各位的补充:

如果想放在__shared__里,请注意sm/smx的一个cycle只能提供32个bank里的数据。特别是对于3.x, 请考虑6组SP竞争来自1组LSU的数据读取请求。以及请考虑可能存在的bank conflict.

如果想放在__constant__里,请注意是否warp内对常数的访问行为是uniform的。如果不是,请谨慎使用。(注意,一些测试表明,即使不是uniform的可能没事,但请无视这些测试。以你的实际效果为准)。

如果,我还观察到楼主的数据有67%的概率均为零,且分布较为顾虑,建议楼主考虑只存储需要的数据,然后访问的时候,进行坐标变换。虽然引入了计算,但因为你的分布会规律,可能变换很简单,从而降低了访存的压力,无论是shared/constant/还是L1/L2, 建议考虑此建议。

上一个建议(适当简单计算,减轻67%的访存压力),和可以进一步引申:
如果楼主的这些常数很容易再次产生,请多少考虑就地计算,也许会带来性能提升。

以上仅供参考,建议听取。当然,您也可以不听,只是建议。