我使用基于Tesla M2090(Fermi)的群集和另一个基于K20Xm(Kepler)的群集。我在Fermi集群上启动的内核比Kepler快2.5倍。 这个内核是使用keys -arch = sm_35 --ptxas-options = -v为Kepler集群编译的,结果是
ptxas info : Compiling entry function '_Z22_repack_one_thread_8_2ILb1EEviPtPPh' for 'sm_35'
ptxas info : Function properties for _Z22_repack_one_thread_8_2ILb1EEviPtPPh
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 18 registers, 344 bytes cmem[0]
因此,使用1024个线程,每个线程18个寄存器和0个字节的共享内存,我有100%的多处理器占用率。
基于Kepler的节点性能更慢的可能原因是什么?
谢谢。
Voytsekh
更新
我的内核
template <bool nocheck>
__global__ void _repack_one_thread_8_2 (int size, word *input, byte **outputs)
{
int idx = blockDim.x * blockIdx.x + threadIdx.x;
if (nocheck || idx * 8 < size)
{
word *ptr = input + idx * 4;
byte bytes[8] = {0,0,0,0,0,0,0,0};
int i, j;
for (i = 0; i < 4; i++, ptr++)
{
word b = *ptr;
for (j = 0; j < 8; j++)
bytes[j] |= (((b >> (j * 2)) & 3) << (i * 2));
}
for (i = 0; i < 8; i++)
outputs[i][idx] = bytes[i];
}
}
开普勒的编译命令
nvcc -arch=sm_35 --ptxas-options=-v -c -O3 -I.. -o
为费米编译命令
nvcc -arch=sm_20 --ptxas-options=-v -c -O3 -I.. -o
答案 0 :(得分:1)
有很多可能的原因。简单地说我的代码在Fermi上运行得更快,但没有详细的代码细节。
有可能你的内核甚至没有在Fermi情况下运行(用-arch=sm_35
编译的代码不会在Fermi GPU上运行)。这肯定会使费米案看起来更好。
还有许多其他可能性。 kepler tuning guide已涵盖了许多可供调查的领域。
您还应该在代码中执行proper cuda error checking,并尝试使用cuda-memcheck
在两种情况下运行代码,以获取有关任何内核执行问题的其他信息。
答案 1 :(得分:-1)
我不记得费米和开普勒的细节差异。开普勒在包装中的计算单位可能比费米少,但有更多的包装可以使用。我会在下班后检查它。
1024线程似乎太少了,无法比较。
所以你可以检查1024 * 1024个线程是否可用。
然后,我做了一些搜索。看起来K20Xm的XSM较少(M2090为14 VS 16),MAD功率较小(384 VS 1332.2 GFLOP),时钟频率较低(732 VS 1301 MHz)。顺便说一下,一个XSM可以被视为两个SM吗?
看起来很奇怪..
来自的数据: wiki, integer slow than float,以及一些白皮书