- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题源于在内核中观察到的理论占用率和实现占用率之间的差异。我知道 different occupancy between calculator and nvprof以及 A question about the details about the distribution from blocks to SMs in CUDA .
让我们考虑一个具有计算能力 = 6.1 和 15 个 SM(GTX TITAN、Pascal 架构、芯片组 GP104)的 GPU。让我们考虑一个 2304 个元素的小问题。
如果我们将内核配置为 512 个线程,那么每个线程将处理一个元素,我们需要 5 个块来处理所有数据。并且内核非常小,因此在使用资源方面没有任何限制,无论是寄存器还是共享内存。
因此,理论上的占用率为 1,因为可以在一个 SM(2048 个线程)中分配四个并发块,从而导致 2048/32 = 64 个事件扭曲(最大值)。
然而,达到的占用率(由 nvidia profiler 报告)为 ~0.215,这可能与块映射到 SM 的方式有关。那么,当块的数量少于可用的 SM 时,如何将它们调度到 CUDA 中的 SM 中?
选项 1.- 将 4 个 512 个线程块调度到一个 SM 中,将 1 个 512 个线程块调度到另一个 SM 中。在这种情况下,入住率将为 (1 + 0.125)/2 = 0.56。我假设最后一个块只有 512 个线程中的 256 个处于事件状态以到达数组的最后 256 个元素,并且它在第二个 SM 中分配。因此,考虑到扭曲粒度,只有 8 个扭曲是事件的。
选项 2.- 将每个 512 块调度到不同的 SM。既然我们有 15 个 SM,为什么只用一个有许多块的 SM 来饱和?在这种情况下,每个 SM 有 512/32 = 16 个事件扭曲(除了最后一个,它只有 256 个事件线程)。因此,我们在四个 SM 中实现了 0.25 的入住率,在最后一个中实现了 0.125,导致 (0.25 + 0.25 + 0.25 + 0.25 + 0.125)/5 = 0.225。
选项 2 更接近视觉分析器报告的占用率,我们认为这是幕后发生的事情。无论如何,值得一问:当它们的数量少于可用的 SM 时,如何将块调度到 CUDA 中的 SM?有记录吗?
——
请注意,这不是家庭作业。这是使用不同第三方库的项目中的真实场景,这些库在由多个内核组成的管道的某些步骤中处理少量元素。
最佳答案
正如几年来针对这个问题发表的评论中所指出的,块调度程序的行为是未定义的,并且不能保证从硬件代到硬件代、从驱动程序/运行时版本到驱动程序/运行时版本,甚至是相同的平台到平台。
当然可以使用汇编器指令检测代码以提取时钟和 SM ID 并运行一些案例以查看设备上发生的情况。正如 Greg Smith 在评论中指出的那样,您可能会得出这样的结论:调度程序首先以广度工作,将 SM 填充到最大可用占用率,但不一定总是这样。最终,您尝试并利用您的发现构建的任何启发式方法都将依赖于未定义的行为。
[从评论中收集并添加为社区维基条目,以将问题从 CUDA 标签的未答复队列中删除]
关于cuda - 当 block 的数量少于可用的 SM 时,如何将它们调度到 CUDA 中的 SM 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43632483/
我的 blockly.js 文件中有以下代码 Blockly.Blocks['account_number'] = { // Other type. init: function() {
首先抱歉我的英语不好,我正在开发 Image Splitter 应用程序并且已经完成,但是现在的要求是当图像被分割(分成几 block /chunks)那么图像 block 的每一 block (ch
#value: 消息的返回值,当发送到一个 block 时,是该 block 中最后一句话的值。所以 [ 1 + 2. 3 + 4. ] value 计算结果为 7。我发现有时很难使用。有没有办法显式
我想构建一个包含 3 div 的响应式导航栏相同的 width和 height . 我申请了 inline-block到每个 block ,我得到一个我不理解的行为。 问题是,第三 block 由 2
我希望使用 Blockly 来允许非技术人员用户指定测试脚本。 它的一部分需要一个文件选择器,但是,我看不到 Blockly 有一个。是吗? 实际上,我找不到完整的标准 block 列表。谁有网址?
仅当您位于父 block 内部时,父 block 的 props.isSelected 才为 true,但当您在该 block 的 innerBlocks 内进行编辑时则不然。 如何从父 block
仅当您位于父 block 内部时,父 block 的 props.isSelected 才为 true,但当您在该 block 的 innerBlocks 内进行编辑时则不然。 如何从父 block
我想创建一个具有不同背景颜色 block 和不同悬停颜色 block 的导航栏 block 。我可以分别创建不同的悬停颜色 block 或不同的背景颜色 block ,但不能一起创建。所以请告诉我如何
我正在使用看到的代码 here定期执行代码: #define DELAY_IN_MS 1000 __block dispatch_time_t next = dispatch_time(DISPATC
为什么 block 必须被复制而不是保留?两者在引擎盖下有什么区别?在什么情况下不需要复制 block (如果有)? 最佳答案 通常,当您分配一个类的实例时,它会进入堆并一直存在,直到它被释放。但是,
我想弄清楚我这样做是否正确: 如果我有一个 block ,我会这样做: __weak MyClass *weakSelf = self; [self performBlock:^{
我想制作一个 4 block 导航菜单,虽然我已经显示了一个 block ,然后单击打开第二个 block ,从第二个开始选择并再次单击出现第三个 block ,第四个 block 相同...这是我的
例如,这样更好吗? try { synchronized (bean) { // Write something } } catch (Int
我想让一只乌龟检查前方小块的颜色并决定移动到哪里。如果前面的补丁不是白色的,那么乌龟向左或向右旋转并移动。我的 If 决策结构中出现错误,显示“此处应为 TRUE?FALSE,而不是 block 列表
我想创建一个 block 对角矩阵,其中对角 block 重复一定次数,非对角 block 都是零矩阵。例如,假设我们从一个矩阵开始: > diag.matrix [,1] [,2] [
我是区 block 链新手。突然我有一个问题,我们是否可以通过区 block 号来访问以太坊区 block 链上之前的区 block 数据。 例如我创建了一个block1、block2。 block
我是区 block 链新手。突然我有一个问题,我们是否可以通过区 block 号来访问以太坊区 block 链上之前的区 block 数据。 例如我创建了一个block1、block2。 block
我创建了一个等距环境,全部使用 Javascript 和 HTML5 (2D Canvas),大部分情况下工作正常。我面临的问题是使用不同高度的图 block ,然后对图 block 上的对象索引进行
这是令我困惑的代码: public Integer getInteger(BlockingQueue queue) { boolean interrupted = false; try
我有一个基于 TPL 数据流的应用程序,它仅使用批处理 block 和操作 block 就可以正常工作。 我已经添加了一个 TransformBlock 以尝试在发布到批处理 block 之前从源中转
我是一名优秀的程序员,十分优秀!