如何在 CUDA 中实现压缩表

How to implement a compression table in CUDA?

本文关键字:实现 压缩 CUDA      更新时间:2023-10-16

我正在尝试优化我的C++代码,我不知道是否有办法使用 CUDA-C 在 GPU 中存储表。表C++中的当前代码为:

double m_alpha = 0.5;
unsigned char* compressionTable = new unsigned char[65536];
double denom = exp(m_alpha * log(65535.0)) / 255.0;
for (unsigned int i = 0; i < 65536; ++i)
     compressionTable[i] = exp(m_alpha * log(i)) / denom;

在我循环访问此表后:

bmode[i][j] = compressionTable[round(abs(sH[i][j]))];

sH 是由短 int 类型数据数组(压缩表2 16 的存储器)获得的希尔伯特变换(数组)。访问的循环不是一个微不足道的问题,但我的主要问题是压缩表的快速实现。我将不胜感激任何帮助。

如果您确实需要使用查找表,在具有 SM 2.0 或更高版本的 GPU 上,您应该将其放入设备内存中,让缓存处理内存流量。 对于查找表,其他内存空间并不比 L1/L2 更好。

但这看起来像是在 CPU 上运行良好的优化在 GPU 上根本不需要的情况。 CUDA 硬件可以计算单精度对数和指数,延迟仅为 4 个时钟周期。 重写算法以内联方式执行计算,而不是使用查找表。生成的代码将具有较少的数据依赖性能,并且内存子系统将被释放出来,以服务运行内核实际所需的内存流量。