我正在尝试使用Nsight IDE对我的代码进行性能分析。
我举了一个矩阵加法的简单例子。
我正在调用我的内核:
VecAdd<<&。1,BLOCK_SIZE BLOCK_SIZE>>>(DA,DB,DC,BLOCK_SIZE BLOCK_SIZE);
这里BLOCK_SIZE是16。
__global__ void VecAdd(float *dA, float *dB, float *dC, int N)
{
int i = threadIdx.x;
if (i < N)
dC[i] = dA[i] + dB[i];
}
在进行占用分析时,
我获得的活动扭曲为0.97。
我无法弄清楚原因。
我附上了一份报告。有人可以解释为什么会这样吗?
答案 0 :(得分:1)
达到占用率是active_warps / elapse_cycles / MAX_WARPS_PER_SM * 100的百分比。
你的内核启动是8个warp的1个块。达到的占用率统计显示平均有1个经线活动非常低。显而易见的问题是为什么这不是8。
由于您没有提供源代码,我假设您修改了VecAdd CUDA SDK示例,该示例执行5次常量读取,2次32位全局加载,1次32位写入以及一些用于索引和地址计算的基本数学运算。假设所有存储器操作都在L2中命中,则每个warp大约需要300个周期。这可能是因为您可能在启动之前将阵列从主机复制到设备。内核持续时间本身可能是2-3μs。 8 * 300个周期/ 2500个周期= 1个SM上每个周期〜1个有效翘曲。
启动开销,工作分配开销以及等待每个warp存储清除写数据缓冲区的时间不算作8个warp处于活动状态的时间。如果增加每个warp的工作量,该值将增加到接近8,这是在启动的线程数量下可实现的最大值。如果你还增加网格尺寸以使设备饱和,那么每个SM应该能够接近64个平均有效扭曲。