我开发了两个CUDA内核。一个是内存绑定内核,另一个是计算绑定。内核首先在Tesla K40上进行了优化,我现在正在对Tesla K40和Tesla K80进行性能测试,以比较它们的性能结果。但是,我真的很困惑,因为我在两个主板上的性能几乎相同,而K80提供了近2倍的理论带宽和DP峰值性能。我还测试了每个块的不同线程数,但再次没有看到特斯拉K80(约2%)与特斯拉K40相比有任何明显的性能改善。
我使用以下标志编译代码:
关于特斯拉K40:
nvcc --cudart static --relocatable-device-code=false -gencode arch=compute_35,code=compute_35 -gencode arch=compute_35,code=sm_35 -link -o "test"
关于特斯拉K80:
nvcc --cudart static --relocatable-device-code=false -gencode arch=compute_37,code=compute_37 -gencode arch=compute_37,code=sm_37 -link -o "test"
理论上,我应该在特斯拉K80上获得更高的性能,但我不知道为什么这不起作用。
感谢您的回答或评论!
答案 0 :(得分:4)
然而,我真的很困惑,因为我在两个主板上获得了几乎相同的性能,而K80提供了近2倍的理论带宽和DP峰值性能。
当您拥有可以利用多个GPU的代码时,Tesla K80仅提供这些优势。您似乎正在为测试运行单个内核(启动),并且K80不会以比K40更快的速度运行单个内核(启动)。
实际上,K80是捆绑在一个物理单元中的两个GPU。这两个GPU中的每一个都具有单个K40的大约80-90%的性能,因此捆绑在一起,它可以提供几乎两倍的性能,但仅限于多GPU感知代码。K80(与K40相比)对单个内核(启动)执行没有任何好处。