如何在 CUDA 中实现压缩 table?
How to implement a compression table in CUDA?
我正在尝试优化我的 C++ 代码,我不知道是否可以使用 CUDA-C 在 GPU 中存储 table。 table 的当前 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;
在我循环访问此 table 之后:
bmode[i][j] = compressionTable[round(abs(sH[i][j]))];
sH是short int类型数据数组(压缩内存table216)。访问循环不是一个小问题,但我的主要问题是 compressionTable 的快速实现。我将不胜感激任何帮助。
如果您确实需要在具有 SM 2.0 或更高版本的 GPU 上使用查找 table,您应该将其放在设备内存中并让缓存处理内存流量。对于查找 tables,其他内存空间并不比 L1/L2.
工作得更好
但这看起来像是在 CPU 上运行良好的优化在 GPU 上根本不需要的情况。 CUDA 硬件可以计算单精度对数和指数,延迟仅为 4 个时钟周期。重写您的算法以在线执行计算而不是使用查找 table。生成的代码将具有较少的数据相关性能,并且内存子系统将被释放以服务 运行 内核实际需要的内存流量。
我正在尝试优化我的 C++ 代码,我不知道是否可以使用 CUDA-C 在 GPU 中存储 table。 table 的当前 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;
在我循环访问此 table 之后:
bmode[i][j] = compressionTable[round(abs(sH[i][j]))];
sH是short int类型数据数组(压缩内存table216)。访问循环不是一个小问题,但我的主要问题是 compressionTable 的快速实现。我将不胜感激任何帮助。
如果您确实需要在具有 SM 2.0 或更高版本的 GPU 上使用查找 table,您应该将其放在设备内存中并让缓存处理内存流量。对于查找 tables,其他内存空间并不比 L1/L2.
工作得更好但这看起来像是在 CPU 上运行良好的优化在 GPU 上根本不需要的情况。 CUDA 硬件可以计算单精度对数和指数,延迟仅为 4 个时钟周期。重写您的算法以在线执行计算而不是使用查找 table。生成的代码将具有较少的数据相关性能,并且内存子系统将被释放以服务 运行 内核实际需要的内存流量。