小编zin*_*nga的帖子

AVX-512 屏蔽内存访问的性能

屏蔽能否提高 AVX-512 内存操作(加载/存储/聚集/分散和非洗牌加载操作)的性能?

鉴于屏蔽元素不会触发内存错误,人们会认为屏蔽在这些情况下有助于提高性能,但是,如果使用 0 屏蔽,则以下情况会怎样:

  • 跨越缓存线边界的加载/存储 - 这会抑制缓存线交叉惩罚吗?
    • 如果其中一个或两个缓存行不在 L1 中,则抑制来自 L2 缓存(或更远的地方)的负载?
    • 屏蔽负载会影响内存重新排序吗?
  • 收集/分散吞吐量似乎受到 CPU 加载存储单元的限制,但是屏蔽元素会减轻这种影响吗?

目前,这将是在当前英特尔处理器的背景下,但了解支持 AVX-512 的 AMD 处理器如何处理此问题将会很有趣。

performance x86 cpu-architecture avx512

10
推荐指数
1
解决办法
588
查看次数

node.js尽管堆大小相当一致,但RSS内存随着时间的推移而增长

我有一个node.js应用程序,尽管heapUsed/heapTotal保持相对稳定,但RSS内存使用似乎仍在增长.

这是一周(从process.memoryUsage())获得的三次内存测量的图表:

记忆图

您可能会注意到有一些循环模式 - 这与应用程序在每天的活动相对应.

实际上堆中似乎有一点点增长,尽管它远不及RSS增长.所以我一直在使用堆转储(使用node-heapdump),并使用Chrome的堆比较功能来查找泄漏.
一个这样的比较可能如下所示(按大小增量按降序排序):

堆转储

实际显示的内容取决于拍摄快照的时间(例如,有时会分配更多的缓冲区对象等) - 这里我尝试采用最能说明问题的示例.

首先要注意的是左侧的尺寸(203MB对345MB)远远高于图中显示的堆尺寸.其次,大小增量显然与142MB的差异不匹配.事实上,按大小增量按升序排序,许多对象已被释放,这意味着堆应该更小!

有没有人有任何想法:

  • 这是为什么?(RSS不断增长,堆大小稳定)
  • 我怎么能阻止这种情况发生,而不是偶尔重新启动服务器?

其他细节:
节点版本:0.10.28
OS:Ubuntu 12.04,64 位

更新:正在使用的模块列表:

谢谢阅读.

memory-leaks node.js

6
推荐指数
1
解决办法
1595
查看次数

缺少面具的AVX-512内在函数?

英特尔的内在指南列出了 AVX-512 K*掩码指令的一些内在函数,但似乎有一些缺失:

  • KSHIFT {L/R}
  • KADD
  • KTEST

英特尔开发人员手册声称内在函数不是必需的,因为它们是由编译器自动生成的.一个人怎么做呢?如果这意味着__mmask*类型可以被视为常规整数,那么它会很有意义,但是测试类似的东西mask << 4似乎会导致编译器将掩码移动到常规寄存器,移位它,然后移回掩码.这是使用Godbolt最新的GCC和ICC 测试的-O2 -mavx512bw.

同样有趣的是,内在函数只处理__mmask16而不是其他类型.我没有测试太多,但看起来ICC不介意采用不正确的类型,但GCC似乎确实尝试确保掩码中只有16位,如果你使用内在函数.

我是不是在寻找上述指令的正确内在函数,以及其他__mmask*类型的变体,还是有其他方法可以实现相同的东西而不需要求助于内联汇编?

c gcc icc intrinsics avx512

6
推荐指数
1
解决办法
932
查看次数

将 SSE 与 AVX128 混合使用以获得更短的指令?

从我能收集到的所有信息来看,混合 SSE 和 128 位 (E)VEX 编码指令没有性能损失。这表明将两者混合应该没问题。当 SSE 指令通常比 VEX 等效指令短 1 个字节时,这可能是有益的。

但是,我从未见过任何人或任何编译器这样做。作为一个例子,在Intel的AVX(128位)MD5实现方式中,各种vmovdqa可替换为movaps(或者vshufps可以用较短的替换shufps,由于DEST和SRC1寄存器是相同的)。
是否有任何特殊原因可以避免 SSE,或者我遗漏了什么?

x86 assembly sse avx micro-optimization

3
推荐指数
1
解决办法
143
查看次数