将CUDA C __constant__变量复制到本地内存是否有性能优势

时间:2013-01-08 18:58:11

标签: c optimization cuda constants local

例如,如果你有一个简单的常量变量__device__ __constant__ int MY_CONSTANT;并且它被同一个内核线程多次访问:

__global__ void move(int* dataA, int* dataB, int* dataC){
    ...
    dataB[threadID] = dataA[threadID] * MY_CONSTANT;
    dataC[threadID] = dataA[[threadID] * dataB[threadID] % MY_CONSTANT;
    ...
}

我可以看到将dataA[threadID]dataA[threadID] * MY_CONSTANT的值存储在局部变量/寄存器中是有益的,以避免不必要的全局读取。忽略这一点,将MY_CONSTANT的值放在局部变量中以避免它被读取两次,或者由编译器处理它是否有益,因为它不能像其他全局数据那样改变。 / p>

1 个答案:

答案 0 :(得分:1)

唯一可以确定的方法是逐个编码并执行以下操作:

  1. 生成并检查PTX代码,以确定编译器为每个实现发出的内容。
  2. 使用代表性输入对每个实施和测试性能进行仪器和配置。
  3. 您所询问的是那种微观优化,它保证了“过早优化”这一短语。我的建议是,除非您发现性能不足以满足您的需求,否则您会忘记此类优化。

    话虽这么说,常量内存存储在全局内存空间中,当被多处理器访问时,会被添加到缓存中。对该存储区域的后续访问具有低得多的延迟。当warp中的所有线程访问相同的常量内存字时,没有冲突,一切都发生得相当快(注意硬件差异很大,而我所说的可能在技术上对你的设备来说不准确,但是外卖是这样的:遵循内存类型的访问模式,你不必担心你在这里问的那种东西。)