小编awd*_*nld的帖子

快速合并L1/L2中4K浮点数的排序子集

在现代(SSE2 +)x86处理器上合并多达4096个32位浮点数的数组的排序子集的快速方法是什么?

请假设以下内容:

  • 整套的大小最多为4096件
  • 子集的大小可以讨论,但我们假设最初在16-256之间
  • 通过合并使用的所有数据应该优选地适合L1
  • L1数据高速缓存大小为32K.16K已经用于数据本身,因此您可以使用16K
  • 所有数据都已经在L1中(具有尽可能高的置信度) - 它刚刚通过一种操作进行操作
  • 所有数据都是16字节对齐的
  • 我们想尽量减少分支(原因很明显)

可行性的主要标准:比in-L1 LSD基数排序更快.

考虑到上述参数,我很想知道是否有人知道这样做的合理方法!:)

c c++ algorithm performance assembly

15
推荐指数
1
解决办法
1338
查看次数

k-way三角集交集和三角剖分

如果我们有K组可能重叠的三角形,那么计算一组新的,不重叠的三角形的计算效率是多少?

例如,考虑这个问题:

镶嵌

这里我们有3个三角形集A,B,C,有一些相互重叠,并希望获得非重叠集A',B',C',AB,AC,BC,ABC,其中例如AC中的三角形将包含A和C之间独有重叠的表面; 和A'将包含A的表面,它们不与任何其他集合重叠.

c++ algorithm graphics performance computational-geometry

15
推荐指数
1
解决办法
1422
查看次数

文件支持的内存映射的CPU缓存行为/策略?

有谁知道在现代x86系统上将哪种类型的CPU缓存行为或策略(例如,不可缓存的写入组合)分配给内存映射文件支持的区域?

有没有办法检测是哪种情况,并可能覆盖默认行为?

Windows和Linux是您感兴趣的主要操作系统.

(编者注:此问题以前被称为内存映射I/O,但该短语具有不同的特定技术含义,特别是在谈论CPU缓存时.即与负载通信的实际I/O设备,如NIC或视频卡/商店.

这个问题实际上是关于什么样的内存mmap(some_fd, ...),当你不使用MAP_ANONYMOUS并且它由磁盘上的常规文件支持时.)

c++ x86 operating-system cpu-architecture cpu-cache

15
推荐指数
1
解决办法
2834
查看次数

在SSE/AVX中选择唯一/重复数据删除

问题
是否有任何计算上可行的方法来使用x86 SIMD指令对一组整数进行寄存器重复数据删除?

示例
我们有一个4元组寄存器R1 = {3,9,2,9},并希望获得寄存器R2 = {3,9,2,NULL}.

限制
稳定性.保存输入顺序没有意义.

输出.但是,任何删除的值/ NULL必须位于寄存器的开头和/或末尾:

  • {null,1,2,3} - 好的
  • {1,2,null,null} - 好的
  • {null,2,null,null} - 好的
  • {null,2,null,1} - 订单无效
  • {null,null,null,null} - 输出无效

如果知道产生一种特定的输出格式,这显然是一个奖励.请假设NULL有效地表示0(零).

一般性.必须能够容忍没有重复项,并且在这种情况下产生相当于输入寄存器的输出.

指令集.我正在寻找以下任何或所有解决方案:SSE2-SSSE3; SSE4.x; AVX,AVX2

algorithm assembly sse simd avx

9
推荐指数
2
解决办法
773
查看次数

图形和版本控制

我有一个有向图数据结构,我试图为每个顶点实现单独的版本控制.这会产生一些有趣的场景,我非常感谢你们有任何想法.具体来说,我希望在遇到所述方案时解决系统的默认行为.

请参见下图:图形版本

场景1:"空指针悖论"

顶点A回滚到版本1.0.由于此回滚将级联其子图,因此C将不再指向D.这可能会产生危险.行为应该是:

  • 1.1:删除边C - > D,创建一个破碎的图
  • 1.2:删除D,留下E孤儿
  • 1.3:删除D和E.
  • 1.4:在删除指向D的所有边(在本例中为E - > D)之前拒绝执行回滚
  • 1.X:替代解决方案?

场景2:"间接影响"

顶点D已更新,因此以下内容成立:

  • D现在是版本1.2
  • E现在是1.1版
  • C现在是1.3版
  • A现在是版本1.3

顶点A现在回滚到版本1.2,因此以下内容成立:

  • A现在是版本1.2
  • C现在是版本1.2
  • D现在是1.1版

默认行为应该是:

  • 2.1:将E回滚到1.0
  • 2.2:由于版本危险而拒绝回滚,实际上会削弱功能
  • 2.X:替代解决方案?

version-control database-design graph-theory graph data-structures

8
推荐指数
2
解决办法
2605
查看次数

查找SSE寄存器中最常出现的元素

有没有人想过如何计算SSE4.x中8位整数向量的模式(统计量)?为了澄清,这将是128位寄存器中的16x8位值.

我希望结果作为矢量掩码选择模值元素.即结果_mm_cmpeq_epi8(v, set1(mode(v))),以及标量值.


提供一些额外的背景; 虽然上面的问题本身就是一个有趣的问题,但我已经通过线性复杂度可以想到的大多数算法.这个课程将消除我从计算这个数字中获得的任何收益.

我希望在这里与大家一起寻找一些深刻的魔法.这有可能是一个近似值可能需要打破这种结合,例如"选择一个频繁出现的元素"例如(NB差针对),这将是值得的.概率答案也是可用的.

SSE和x86有一些非常有趣的语义.可能值得探索超优化传递.

algorithm x86 assembly sse

8
推荐指数
2
解决办法
343
查看次数

在2D地图上生成区域

有没有为2D地图生成区域的好方法?假设您有一张世界地图,并希望创建具有某种逼真外观的国家或省界.

algorithm 2d

7
推荐指数
1
解决办法
1838
查看次数

缓存行是否刷新访问TLB?

假设我们故意使DTLB崩溃,并且希望继续使用clflush内存区域从L1-3刷新特定的高速缓存行,该内存区域(很可能)与TLB条目指向的地址不相交; 这实际上会把我们正在刷新的缓存行的页面基地址带回TLB吗?

简而言之,clflush触摸TLB究竟是什么?我假设由于这条指令尊重一致性,它随后将该行写回内存(显然需要TLB查找.)

x86 assembly caching cpu-architecture tlb

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