Cuda 编程中的主动扭曲

Posted

技术标签:

【中文标题】Cuda 编程中的主动扭曲【英文标题】:Active warps in Cuda programming 【发布时间】: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 个块开始,因为我想查看性能分析。现在我的目标是增加入住率。 【参考方案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 个平均活动扭曲。

【讨论】:

以上是关于Cuda 编程中的主动扭曲的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将线程显式映射到 CUDA 中的特定扭曲?

cuda编程CUDA中的atomic原子操作

cuda编程CUDA中的atomic原子操作

使用多少个 CUDA 核心来处理一个 CUDA 扭曲?

CUDA 扭曲和线程发散

CUDA:关于活动扭曲(活动块)以及如何选择块大小的问题