Cuda 了解入住率计算器

Cuda 了解入住率计算器,cuda,calculator,Cuda,Calculator,我无法理解入住率计算器。我在一些开发代码中遇到了问题,其中512个线程工作正常,但1024个线程给出了糟糕的数字 我在Windows7上运行特斯拉C2050,在Matlab中开发(这不是我的错,我必须使用Matlab)和Mexfunction 我想我会玩一下占用率计算器,试着在我的代码中找到影响结果的任何其他限制 当我为每个块输入1024个线程时,占用率为0%。对于512个线程,占用率为33%。我本以为我至少可以得到1024个线程。我注意到,对于最多704个线程,代码和占用率计算器给出了很好的结

我无法理解入住率计算器。我在一些开发代码中遇到了问题,其中512个线程工作正常,但1024个线程给出了糟糕的数字

我在Windows7上运行特斯拉C2050,在Matlab中开发(这不是我的错,我必须使用Matlab)和Mexfunction

我想我会玩一下占用率计算器,试着在我的代码中找到影响结果的任何其他限制

当我为每个块输入1024个线程时,占用率为0%。对于512个线程,占用率为33%。我本以为我至少可以得到1024个线程。我注意到,对于最多704个线程,代码和占用率计算器给出了很好的结果(这个数字并不代表任何实际情况)

我相信我对这方面的理解不足是我无法纠正代码中出现的错误的原因。有人能解释为什么我会得到这些结果吗

有关数字如下:

  • 计算能力2.0
  • 共享内存大小49152
  • 每个块512或1024的线程数
  • 每个线程的寄存器44
  • 每个块0的共享内存

ptxas信息:使用了44个寄存器,232个字节cmem[0],144个字节cmem[2],28个字节cmem[16]

每个块的寄存器总数是32768(您可以使用SDK中的deviceQuery进行检查)。 现在,根据您的内核,它使用44个寄存器/线程。如果启动内核时每个块有1024个线程,那么总共会得到44*1024=45056个寄存器,这超出了限制。
为了在每个块1024个线程的情况下运行它,您需要优化内核,使每个线程使用的寄存器不超过32个

请注意,占用率为0.33并不坏,应该有足够的线程来覆盖内存延迟。为了实现更高的占用率,最好将块大小减少到128个线程,这样可以在每个SM上同时运行640个线程(5个块,每个块包含128个线程)。一旦基本延迟被覆盖,占用率和性能之间就没有很强的相关性。