Performance 内核执行时间如何随着占用率的提高而增加?

Performance 内核执行时间如何随着占用率的提高而增加?,performance,cuda,Performance,Cuda,内核每个线程使用54个寄存器,占用率为0.33。它有一个if语句用于调试: if ( -1 == val ) // val is INT32 { printf( "Invalid value!\n" ); } 如果我注释掉这个If语句,内核每个线程使用33个寄存器,占用率也提高到0.5。但是,奇怪的是,这个新的更精简的内核实际上需要15%以上的时间来执行!所有其他代码和启动参数(块、线程)都是常量。有人能解释一下这种性能下降是如何发生的吗 我正在GTX 580上使用CUDA 4.0,代

内核每个线程使用54个寄存器,占用率为0.33。它有一个if语句用于调试:

if ( -1 == val ) // val is INT32
{
    printf( "Invalid value!\n" );
}
如果我注释掉这个If语句,内核每个线程使用33个寄存器,占用率也提高到0.5。但是,奇怪的是,这个新的更精简的内核实际上需要15%以上的时间来执行!所有其他代码和启动参数(块、线程)都是常量。有人能解释一下这种性能下降是如何发生的吗


我正在GTX 580上使用CUDA 4.0,代码编译为CUDA capability 2.0。

Ashwin,能否提供有关算法、启动参数等的其他详细信息。。。VisualProfiler v4.1和Parallel Nsight都有额外的指标,可以帮助您识别瓶颈


理论占用率是SM隐藏延迟的抽象度量。将入住率提高到一定程度以上可能不会提高性能,并可能影响性能。例如,随着占用率的增加,L1字节/线程的数量正在减少。要查看的一项是缓存命中率。

首先,您确定内核运行较慢吗?具体来说,你是如何测量时间的?你们的发射参数是什么?我知道有一列火车在矿井和港口之间运行。从港口到矿山的列车空驶比满载矿石从矿山到港口的列车消耗更多的燃料。这就引出了一个问题:为什么?答案是我没有告诉你的。这个问题几乎是一样的——答案显然是你没有告诉我们的。如果没有比您目前提供的更多的信息,就很难回答这个问题。哈里斯:我正在从CUDA档案器中查找这个内核的时间,所以我想这不会是错的。我用超过100万个元素的>数据启动。列车问题的答案是,矿井位于山脉中,港口位于海平面。因此,火车从矿井下山,从港口上山。这个问题怎么样,还有什么可以提供的见解吗?鹰爪:是的。如果我将每个块的线程数从128个减少到32个,内核将正常运行。也就是说,单个if语句不会出现奇怪的减速或加速。有了32个线程,内核实际上比以前任何时候都快30%。这有什么线索吗?格雷格:两个版本的启动参数都是>。我无法收集缓存指标,因为每次执行时,应用程序中的内核调用数量略有不同。格雷格:我还对两个版本的内核生成的PTX代码进行了区分。除了对vprintf的调用之外,没有什么特别的。