将CUDA C__常量__变量复制到本地内存是否有性能优势

将CUDA C__常量__变量复制到本地内存是否有性能优势,c,optimization,cuda,constants,local,C,Optimization,Cuda,Constants,Local,例如,如果您有一个简单的常量变量\uuuuu设备\uuuuuu常量\uuuuuuu int MY\u常量并且它被同一内核线程多次访问: __global__ void move(int* dataA, int* dataB, int* dataC){ ... dataB[threadID] = dataA[threadID] * MY_CONSTANT; dataC[threadID] = dataA[[threadID] * dataB[threadID] % MY_C

例如,如果您有一个简单的常量变量
\uuuuu设备\uuuuuu常量\uuuuuuu int MY\u常量并且它被同一内核线程多次访问:

__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_常量
的值存储在局部变量/寄存器中是有益的,以避免不必要的全局读取。忽略这一点,将
MY_CONSTANT
的值放在局部变量中以避免它被读取两次是有益的,还是由编译器处理,因为它与其他全局数据不同,无法更改。

唯一确定的方法是对其进行编码并执行以下操作:

  • 生成并检查PTX代码,以确定编译器为每个实现发出什么
  • 使用具有代表性的输入,对每个实施和测试性能进行仪器和配置
  • 你所问的是一种微优化,它保证了“过早优化”这句话的正确性。我的建议是,除非您发现性能不足以满足您的需求,否则不要考虑此类优化


    也就是说,常量内存存储在全局内存空间中,当被多处理器访问时,就会添加到缓存中。对该内存区域的后续访问具有更低的延迟。当一个warp中的所有线程访问同一个字的恒定内存时,就不会发生冲突,而且一切都会很快发生(请注意,硬件差异很大,我所说的可能在技术上并不适用于您的设备,但要点是:遵循内存类型的访问模式,您就不必担心您在这里提出的问题)。

    唯一确定的方法是对每种方式进行编码并执行以下操作:

  • 生成并检查PTX代码,以确定编译器为每个实现发出什么
  • 使用具有代表性的输入,对每个实施和测试性能进行仪器和配置
  • 你所问的是一种微优化,它保证了“过早优化”这句话的正确性。我的建议是,除非你发现性能不足以满足你的需求,否则不要考虑这种优化


    也就是说,常量内存存储在全局内存空间中,当被多处理器访问时,会被添加到缓存中。随后对该内存区域的访问具有更低的延迟。当一个warp中的所有线程访问同一个常量内存字时,不会发生冲突,而且一切都会很快发生(请注意,硬件差异很大,我所说的可能在技术上并不适用于您的设备,但要点是:遵循内存类型的访问模式,您不必担心您在这里提出的问题).

    谢谢。我会尝试一下。我怀疑这与上面的示例没有什么区别,但如果缓存被更多地使用,它可能会与更复杂的内核有关。谢谢。我会尝试一下。我怀疑这与上面的示例没有什么区别,但如果缓存被禁用,它可能与更复杂的内核有关我们将被更多地使用。