【问题标题】:Active warps in Cuda programmingCuda 编程中的主动扭曲
【发布时间】:2014-07-09 15:49:33
【问题描述】:

我正在尝试使用 Nsight IDE 对我的代码进行性能分析。

我举了一个矩阵加法的简单例子。

我这样称呼我的内核:

VecAddBLOCK_SIZE>>>(dA,dB,dC,BLOCK_SIZEBLOCK_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];
}

在进行占用分析时,

我的 Active warp 达到 0.97。

我不知道为什么。

我已附上一份报告。有人可以解释一下为什么会这样吗?

【问题讨论】:

  • 您正在运行 one 单个 16*16 块?我不确定这对于合理的个人资料是否足够。
  • 我从 16*16 线程和 1 个块开始,因为我想查看性能分析。现在我的目标是增加入住率。

标签: c++ visual-studio-2010 cuda nvidia nsight


【解决方案1】:

Achieved Occupancy 是 active_warps / elapse_cycles / MAX_WARPS_PER_SM * 100 的百分比。

您的内核启动是 1 个 8 个 warp 块。实现的入住率统计显示,您平均有 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 处于活动状态的时间。如果您增加每个扭曲的工作,该值将增加到接近 8,这是给定启动的线程数可实现的最大值。如果您还增加网格大小以使设备饱和,则每个 SM 应该能够获得接近 64 个平均活动扭曲。

【讨论】:

    猜你喜欢
    • 2018-01-24
    • 2014-12-09
    • 2013-02-16
    • 2011-08-08
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多