问题标签 [coalescing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3694 浏览

memory - CUDA - 合并内存访问和总线宽度

所以我关于在 CUDA 中合并内存访问的想法是,warp 中的线程应该访问连续的内存地址,因为这只会导致单个内存事务(然后将每个地址上的值广播到线程)而不是多个那些将以串行方式执行的。

现在,我的总线宽度是 48 字节。这意味着我可以在每个内存事务中传输 48 个字节,对吧?因此,为了充分利用总线,我需要能够一次读取 48 个字节(通过每个线程读取一个以上的字节 - 内存事务由 warp 执行)。但是,假设,一次读取 48 个字节的单个线程不会提供相同的优势(我假设我可以通过读取大小为 48 个字节的结构一次读取 48 个字节)?

我的合并问题是我必须对数据进行转置。我有很多数据,因此转置需要时间,如果可以的话,我宁愿将其用于其他事情。

我正在使用计算能力 2.0。

0 投票
1 回答
917 浏览

cuda - 未合并的 float2 CUDA 内核

我在优化下面示例的网格和块大小时遇到​​问题。当我进行分析时,内核代码中的内存写入操作似乎没有合并。

我在互联网上找到了一些解决方案,但他们建议我将 c_image 的结构更改为[x1, x2, x3...] [y1, y2, y3...]

但是我需要这个结构,[x1, y1] [x2, y2]...因为我在其他地方的代码上使用了 CUFFT 库,这需要这种精确的形式。

在 c_image 结构中是否有一种合并的方式来执行操作?

我的代码:

非常感谢!

PS:我试过这个,但没有运气!CUDA float2 合并

0 投票
1 回答
403 浏览

memory-management - cuda 内存合并

我想首先确认以下几点:到共享内存的基本全局内存事务是 32 字节、64 或 128 字节,但前提是内存访问可以合并。先前交易的延迟都是相等的。那正确吗?

第二个问题:如果内存读取不能合并,每个线程只读取 4 个字节(对吗?)所有线程的内存访问都是顺序的吗?

0 投票
2 回答
262 浏览

css - CSS 性能:Web 浏览器会合并 CSS 规则的执行吗?

Web 浏览器是否合并 css 规则的执行以便它们高效运行?

我知道多个css规则是级联的。

我只对级联规则的性能影响感兴趣。

例如,对于以下内容:

我知道两者都display:block;margin:1rem;应用于selects。

我只是不确定浏览器是否优化了其内部 css 选择器检查。在上面的示例中,次优浏览器可以检查:

  1. 如果按钮,或选项,或选择,然后显示:块;
  2. 如果选择,则margin:1rem;

执行这些检查的最佳方法是:

  1. 如果是按钮或选项,则显示:块;
  2. 如果选择,则显示:块;保证金:1rem;

大多数现代浏览器是否足够智能以合并选择器的两个规则的执行,select以便它们运行第二组检查(最佳检查)?

如果是这样,哪些浏览器及其版本执行 css 规则合并?

链接到有关此的文档,或浏览器功能列表站点上的信息,也将不胜感激。

我对此感兴趣,因为我想最小化我的 css(有时涉及复制选择器部分以避免重复声明),并使我的 css 更易于维护。但是,我想确保我的客户的浏览器不会浪费运行冗余 css 选择器的周期。

谢谢。

0 投票
1 回答
864 浏览

memory - CUDA:什么时候可以实现合并记忆?

我很难理解这个概念。我在网上研究了很多,我唯一理解的是线程需要访问连续的数据。

因此,如果我们有一个 10000 个整数的数组,如果线程i访问数组的i第 - 个数字,那么内存将合并。

如果不是为所有整数设置 10000 个线程,而是决定设置 500 个线程,每个线程访问两个连续的整数,会怎样?在这种情况下,内存合并是可能的吗?

如果我们决定允许一个线程访问超过 2 个值,例如 10,该怎么办?

在这种情况下,内存合并将如何表现?在我上面描述的示例中,“连续访问”何时停止“连续”?

先感谢您

0 投票
1 回答
958 浏览

memory - 全局内存重播开销从何而来?

运行以下代码在 NVIDIA Visual Profiler 中写入 1 GB 全局内存,我得到:
- 100% 存储效率
- 69.4% (128.6 GB/s) DRAM 利用率
- 18.3% 总重放开销
- 18.3% 全局内存重放开销。

内存写入应该是合并的,内核中没有分歧,所以问题是全局内存重放开销来自哪里?我在 Ubuntu 13.04 上使用 nvidia-cuda-toolkit 版本 5.0.35-4ubuntu1 运行它。

0 投票
3 回答
655 浏览

linux - Linux select()和多个套接字的FIFO排序?

Linux select() 调用中继事件排序有什么方法吗?

我所看到的描述:

在一台机器上,我编写了一个简单的程序,它发送三个多播数据包,一个到三个不同的多播组中的每一个。这些数据包是背靠背发送的,中间没有延迟。即发送到(mcast_group1);发送到(mcast_group2);发送到(mcast_group3)。

在另一台机器上,我有一个接收程序。该程序为每个多播组使用一个套接字。每个套接字执行一个 bind() 和 IP_ADD_MEMBERSHIP(即加入/订阅)到它所侦听的地址。然后程序在三个套接字上执行 select()。

当 select 返回时,所有三个套接字都可供读取。但是哪个先来?待读套接字列表是一个集合,因此没有顺序。我想要的是如果 select() 每个接收到的数据包只返回一次,按顺序(增加的开销在这里是可以接受的)。或者,我可以使用其他某种机制来确定数据包接收顺序吗?

附加信息:

  • 操作系统是 x86_64 上的 CentOS 5(实际上是 Redhat Enterprise Linux)
  • 网卡硬件是 Intel 82571EB
  • 我已经尝试过 e1000e 驱动程序版本 1.3.10-k2 和 2.1.4-NAPI
  • 我尝试将 NIC 的中断固定到未加载和隔离的 CPU 内核
  • 我通过设置驱动程序选项 InterruptThrottleRate=0 禁用硬件 IRQ 合并,并通过 ethtool 设置 rx-usecs=0
  • 我也尝试使用 epoll,它具有相同的行为

最后一点:如果我只使用一个套接字,则会保留数据包顺序。在这种情况下,我绑定到 INADDR_ANY (0.0.0.0) 并在同一个套接字上多次执行 IP_ADD_MEMBERSHIP。但这对我们的应用程序不起作用,因为我们需要通过绑定到实际多播地址来提供过滤。最终,同一台机器上会有多个多播接收程序,订阅集可能相互交叉。所以也许另一种解决方案是找到另一种方法来实现bind()的过滤效果,但没有bind()。

0 投票
1 回答
108 浏览

memory - 如果每条数据占用 128 位或更多,将它们分组在内存中是否有任何优势?

我在 CUDA 编程指南中读到,CUDA 设备中的全局内存是通过 32、64 或 128 位的事务访问的。知道了这一点,比如说,在内存中将一组 float4(128 位)放在一起有什么好处?据我了解,无论float4是分布在内存中还是按顺序分布,事务的数量都是一样的。还是将所有访问合并到一个巨大的交易中?

0 投票
1 回答
240 浏览

c++ - CUDA 固定内存和合并

在计算能力 2.x 设备上,我如何确保 gpu 在使用映射固定内存时使用合并内存访问,并假设通常在使用全局内存时 2D 数据需要填充?

我似乎无法在任何地方找到有关此的信息,也许我应该看起来更好,或者也许我错过了一些东西。欢迎任何指向正确方向的指针......

0 投票
1 回答
189 浏览

memory-management - CUDA:为什么不合并访问同一个设备阵列?

我正在发布一个深入研究的代码以供审查。我相信它应该可以毫无问题地编译和执行,但由于我排除了所有不相关的部分,我可能犯了一些错误。

这是我的带有固定长度数组的用户结构。下面给出主要功能。

请注意,Step 数组是具有 96 个 bin 的 1D 数组,我跨越 10 个 warp(x 方向上的 32 个线程,我的块中有 10 个线程)。每个经纱将访问相同的 Step 数组。这可以在下面的内核中看到。

现在,当我使用 NVIDIA Visual Profiler 时,合并后的检索率为 47%。我进一步调查并发现每个经线正在访问的 Step 数组会导致此问题。如果我用一些常量替换它,则访问是 100% 合并的。

Q1)据我了解,合并访问链接到字节行,即字节行必须是 32 的倍数,无论它们是整数还是双字节行。为什么我没有获得合并访问?

据我所知,cuda 每当在设备全局内存中分配一个内存块时,它都会为其分配一个偶数地址。因此,只要起点 + 32 位置由经线访问,就应该合并访问。我对么?

硬件

Geforce GTX 470,计算能力 2.0