例如,如果你有一个简单的常量变量__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>
答案 0 :(得分:1)
唯一可以确定的方法是逐个编码并执行以下操作:
您所询问的是那种微观优化,它保证了“过早优化”这一短语。我的建议是,除非您发现性能不足以满足您的需求,否则您会忘记此类优化。
话虽这么说,常量内存存储在全局内存空间中,当被多处理器访问时,会被添加到缓存中。对该存储区域的后续访问具有低得多的延迟。当warp中的所有线程访问相同的常量内存字时,没有冲突,一切都发生得相当快(注意硬件差异很大,而我所说的可能在技术上对你的设备来说不准确,但是外卖是这样的:遵循内存类型的访问模式,你不必担心你在这里问的那种东西。)